Stack Shooter: Vampire Siege - Project Story

Inspiration

I've spent years watching games treat Reddit as a marketing platform drop a link, hope for upvotes, move on. That always felt like a missed opportunity. Reddit already has everything you need for community competition: subreddits with distinct identities, natural rivalry between communities, built-in discussion threads.

What if I built a game where your subreddit membership actually mattered? Where r/gaming competing against r/indiegaming meant something? Where individual actions contributed to collective achievements?

I was inspired by Vampire Survivors' addictive upgrade loop, but I wanted to layer genuine community competition on top of it. Not a leaderboard bolted onto a single-player game, but a game designed from the ground up for Reddit's community structure.

The core question: How do I make a fundamentally single-player experience feel genuinely multiplayer without requiring real-time connections or coordination?

What it does

Stack Shooter: Vampire Siege is a top-down survival shooter where you defend against endless waves of vampires. You have four difficulty modes ranging from accessible Easy to brutal Nightmare, six upgrade paths for customizing your build, and wave-based progression where enemies get stronger and more numerous.

But the real innovation is what happens beyond the individual game session.

Community Competition Layer

Every player can create or join a squad basically a clan within their subreddit. Your individual score adds to your squad's total. Your squad's score contributes to your subreddit's ranking.

Four leaderboard types because different players care about different competitions:

  • Global leaderboards for players who want to be number one worldwide
  • Subreddit leaderboards for community pride (r/gaming vs r/vampires)
  • Daily leaderboards that reset every 24 hours be mediocre globally but win the day
  • Weekly leaderboards for consistent performance over time

Daily challenges apply the same modifiers to everyone. Monday might be "Speed Demons" where everything moves twice as fast. Tuesday could be "Tank Mode" where enemies hit harder but you're tougher. Eight challenge types rotate to keep things fresh.

The entire system is asynchronous. No servers to maintain, no lag, no battery drain, no coordination required. You play when you want, your score still matters to your community. Works perfectly on mobile where most Reddit users browse.

Why This Works on Reddit

Each subreddit has its own leaderboard. When r/gaming overtakes r/indiegaming, people notice. They discuss it in comments. They coordinate challenge attempts in daily threads. I didn't have to manufacture community engagement I just plugged into Reddit's existing community structure.

Players naturally share achievements in comments. Squads form informal tournaments. Subreddits track their collective progress. The infrastructure creates the gameplay, but the community creates the culture on top of it.

How I built it

Technology Stack

Devvit for Reddit integration, React for UI, TypeScript for type safety, Redis for persistence via Devvit, Express for the API layer. Standard modern web development tools, nothing exotic.

Development Process

I spent 60+ hours building Stack Shooter. Not a sprint, not a hackathon rush 60+ hours of deliberate, careful development. I wanted to understand every part of the system rather than generating code quickly and hoping it worked.

Throughout development, I used Kiro's conversational AI for assistance. When I hit a problem, I'd discuss it with Kiro. When I needed to implement a feature, I'd talk through the approach. When I was debugging, Kiro helped me think through what might be wrong.

I also created a custom auto-commit hook that analyzes recent changes and generates natural-toned commit messages. Small automation, but it kept me in flow during long coding sessions. The hook is in my .kiro/hooks/ directory along with helpful defaults from the Devvit template.

Technical Decisions That Mattered

Shared Types Architecture: I created src/shared/types/api.ts for type definitions used by both client and server. Change a type once, TypeScript catches mismatches everywhere. Simple pattern, prevented probably a dozen bugs.

Component Structure: Each feature lives in its own .jsx and .css file in the same directory. When I need to modify leaderboards, everything's together. No hunting through three folders to find related code.

Responsive Design: I targeted Devvit's specific layout modes rather than generic mobile breakpoints. Fullscreen mode (over 1200px) gets full-size UI. Desktop/tablet (769-1200px) scales down 75%. Mobile (under 768px) gets a compact layout optimized for one-handed play. This required testing on actual devices browser dev tools caught maybe 60% of issues, real phones found the rest.

Redis for Leaderboards: Used sorted sets with composite keys: leaderboard:global, leaderboard:subreddit:{id}, leaderboard:daily:{date}, leaderboard:weekly:{weekNumber}. O(log N) insertions and fast range queries for top players across all four leaderboard types. The schema wasn't obvious at first I tried several approaches before landing on this one.

Mobile-First Development: Built for phones first, expanded to desktop second. Touch controls are responsive, UI elements are thumb-friendly, performance is smooth even on my 3-year-old Android phone. Most developers do the opposite and their mobile experience suffers.

Challenges I ran into

The Multiplayer Pivot

I initially spent about 20 hours building a real-time multiplayer system with WebSockets and lobby management before realizing it was fundamentally wrong for Reddit.

Real-time multiplayer on mobile drains batteries. Maintaining connections is painful. Time zones make simultaneous play hard. And Reddit users don't browse in scheduled gaming sessions they check Reddit throughout the day in short bursts.

I scrapped that work and rebuilt around asynchronous community features. Daily challenges create shared experiences without requiring simultaneous play. Squad scores accumulate over time. Subreddit leaderboards update as people play throughout the day.

It was the right architectural decision, but those 20 hours hurt.

Responsive Design Reality

Everything looked perfect in Chrome dev tools mobile emulation. Then I tested on my actual phone and discovered touch targets were too small, fonts were illegible, and the virtual joystick overlapped the score display.

Devvit's tablet mode isn't standard tablet size. Their fullscreen mode isn't exactly 1080p. Browser emulation gives you maybe 60% of the issues. You have to test on real devices with actual fingers to find the rest.

The solution was systematic testing: every component, across three layout modes, with actual fingers not mouse cursors. Tedious but necessary.

Mobile Touch Controls

Making a fast-paced shooter work with touch controls was harder than I expected. Virtual joystick for movement, tap-to-shoot mechanics. The first version felt sluggish noticeable delay between touch and response that made the game unplayable.

The fix was increasing touch target sizes and reducing the joystick dead zone. Also moved critical UI elements out of the bottom corners where people naturally rest their thumbs while holding phones. Small changes, huge impact on how the game feels.

Single-Player That Feels Multiplayer

The conceptual challenge: creating genuine community competition without requiring everyone to play simultaneously.

The answer was separating individual action from collective results. You play alone, whenever you want, at your own pace. But your score contributes to your squad's total, which contributes to your subreddit's ranking. Daily challenges mean everyone faces the same modifiers that day, creating shared experiences to discuss in comments.

Asynchronous multiplayer not real-time, but real community impact.

Redis Data Structure Design

I needed four leaderboard types but the schema wasn't obvious. Separate tables? Composite keys? How do I handle daily resets without expensive operations?

Tried several approaches before landing on Redis sorted sets with composite keys. This let me insert scores once and query efficiently across all leaderboard types. Daily resets are just creating a new key no need to clear old data.

It seems obvious in retrospect. It wasn't when I was designing it.

Accomplishments I'm proud of

Community Architecture That Creates Emergent Gameplay

The squad and leaderboard system creates behavior I didn't explicitly design. Squads form informal tournaments. Subreddits coordinate challenge attempts in their daily threads. Players track their community's ranking and actually care when they move up or down.

I built infrastructure. The community built culture on top of it. That's what I was hoping for.

Async Multiplayer That Works on Mobile

Real-time multiplayer has lag, requires servers, drains batteries, and demands simultaneous play. My async approach sidesteps all of that.

Play whenever you want. Your score still contributes. No lag, no battery drain, no coordination required. For Reddit specifically, where people browse throughout the day in short sessions, this is the right technical approach.

Subreddit-Specific Leaderboards

This feature creates genuine community identity. Each subreddit competes as a community. It's not "who's the best player globally" but "is r/gaming better than r/indiegaming at Stack Shooter?"

That creates pride, rivalry, natural engagement. When r/gaming overtakes another subreddit, people notice and discuss it. I didn't have to manufacture that I just built the infrastructure that makes it possible.

Mobile-First Polish

The game feels native on phones. Touch controls are responsive, UI elements are appropriately sized, performance is smooth even on older devices. I tested on my 3-year-old Android phone and optimized until it ran at 60fps.

Most developers build for desktop and "make it work" on mobile. I did the opposite, and the mobile experience benefits from that priority.

60+ Hours of Deliberate Work

I didn't rush this. I built it carefully, understanding each piece, making deliberate decisions about architecture and design. When I hit problems, I worked through them rather than papering over them with quick fixes.

The result is a codebase I understand completely. Other developers have looked at it and understood the architecture immediately because it's clear, modular, and consistent. When I need to add features or fix bugs, I know exactly where to look.

What I learned

Community Features Over Technical Complexity

The most impactful features weren't the most technically complex. Subreddit leaderboards are simple Redis queries but create strong community identity. Daily challenges are just modified game parameters but create shared experiences. Squad scores are basic addition but enable team competition.

The learning: focus on features that bring people together, not just technical showcases. The Redis schema was interesting to design, but players care about seeing their subreddit's name on a leaderboard.

Async Multiplayer for Mobile Platforms

Real-time multiplayer would have been more technically impressive. It also would have worked poorly on mobile, required server maintenance, and created lag issues.

Async multiplayer is simpler technically but better for the platform and user experience. Players contribute anytime. It scales infinitely. It works perfectly on mobile. Sometimes the simpler technical solution is the right one.

Responsive Design Requires Device Testing

Media queries look good in browser dev tools but need real device testing. Tablet view in Devvit is different from standard tablet sizes. Touch targets need to be larger than you think. Font sizes that work on desktop are too small on mobile. Performance that's smooth on your development machine stutters on older phones.

The learning: test on actual devices, not just emulators. Budget time for this it's not optional polish, it's necessary validation.

Build for How People Actually Use the Platform

Reddit users browse throughout the day in short sessions, mostly on mobile. They're part of communities with distinct identities. They discuss things in comments naturally.

I could have fought against that usage pattern tried to make people play at scheduled times, ignored mobile, treated Reddit as just hosting infrastructure. Instead, I designed for the platform's actual usage: async play that works on mobile, community competition that leverages subreddits, features that create things worth discussing in comments.

The game works because it fits how people actually use Reddit.

Manual Building Teaches You Things

60+ hours of deliberate development taught me the system deeply. I understand why every architectural decision was made. I can explain the tradeoffs. I know where the complexity lives and why.

This matters for maintenance and extension. When I add achievements or seasonal events or squad tournaments, I understand exactly how they'll fit into the existing architecture. There's no mysterious generated code I'm afraid to touch.

What's next for Stack Shooter: Vampire Siege

Short-Term Enhancements

Achievement system with badges for milestones 100 kills, 10 waves survived, first daily challenge completion. Streak tracking to reward players who complete daily challenges consistently. One-click sharing so players can post achievements directly to subreddit comments. Custom squad emblems letting squads choose icons and colors for identity. Boss waves every 10 rounds for variety and tension.

These are polish features that make the core experience richer without changing fundamental gameplay.

Medium-Term Features

Seasonal events during holidays with unique challenge modifiers. Squad tournaments with scheduled competitions and prizes. Power-up drops during gameplay for temporary boosts. Multiple maps with different layouts and environmental hazards. Character skins for cosmetic customization and personalization.

This is about depth more variety, more reasons to keep playing, more ways for communities to distinguish themselves and express identity.

Long-Term Vision

Cross-subreddit tournaments with official competition between communities and recognition for winners. User-generated challenges where players create custom modifier combinations and share them. Spectator mode for watching top players' runs and learning techniques. Replay system to save and share your best performances. Potentially a native mobile app with push notifications for daily challenges and squad activity.

This is about scale growing from a Devvit game into a proper Reddit gaming platform that becomes part of the site's culture.

Community Growth

Qualify for Reddit's developer fund program to support continued development. Iterate based on player feedback from actual communities playing the game. Partner with gaming subreddits for exclusive events and custom challenges. Support content creators with tools for streaming and recording gameplay.

The foundation is solid. The community features create genuine engagement. The mobile experience works. Now it's about building on that foundation systematically, responding to what players actually want, and growing the game alongside its community.


The game is live, the community features work, and the foundation is ready for growth. Stack Shooter is designed to be part of Reddit's gaming culture, not just hosted on it.

Built With

Share this project:

Updates