🌑 Inspiration

Some ideas start with a question. Ours started with a feeling.

What if you were trapped inside a building with no lights, something hunting you in the dark, and the only thing keeping you alive was a flashlight with a dying battery — and you had to share that experience with strangers on Reddit, in real time, inside a single post?

That question became Blackout.

We've always been drawn to games that use tension as a core mechanic — not jump scares, not cutscenes, but the slow, creeping dread of not knowing what's around the corner. The fog-of-war survival genre does this better than almost anything else. But we wanted something more: a game where the community isn't just watching, it's inside the danger with you.

Reddit is uniquely positioned for this. It's a platform built on shared experience, collective reaction, and the kind of organic conversation that no other platform generates. We didn't want to build a game for Reddit. We wanted to build a game that could only exist because of Reddit — where the co-op matters, where the leaderboard lives in the community, and where reaching the top 3 isn't just a personal achievement but a moment the subreddit witnesses together.

The fog-of-war gave us the tension. Reddit gave us the stakes. Blackout was born from that collision — and it hasn't stopped surprising us since.


🎮 What It Does

Blackout drops you into a multi-floor facility moments after a complete power failure. You are alone — or not, if up to four others join you in the same Reddit post. You have a flashlight. It has a battery. The battery is dying.

Your mission is deceptively simple: climb ten floors, find the antidote hidden near the top, and reach the exit. But between you and that exit are some of the most varied threats we could design — and a game world that never generates the same layout twice.

The flashlight is everything. It's your vision, your greatest tool, and your biggest liability. Monsters detect you by light. Guards trigger laser alarms when your beam crosses them. The battery drains constantly, flickers dangerously below 25%, and can be switched off completely with a single key — plunging you into near-total darkness, invisible to most threats, but also nearly blind. Every second you spend in the light is a calculated risk.

The weapons are real. You start with a samurai katana — infinite, melee, satisfying. From the in-game shop you can pick up a pistol, shotgun, grenades, gas bombs, dynamite (plant it, choose when to detonate), or a bazooka whose missiles leave a trail, hit with area damage, and can blow open breakable walls to create shortcuts that didn't exist moments ago. Your ammo and inventory persist between runs — bought and not spent, it waits for you next time.

The threats are layered. Three monster species with completely different detection behaviors patrol the floors. Laser guards trigger on your flashlight beam. Katana ninjas crouch at chokepoints and react to proximity. Machine-gun monsters open fire from range. Phantoms are nearly invisible and terrifyingly fast. Stationary turrets scan and shoot but don't pursue. Hunter turrets do pursue — their bullets home in on you, correct course in real time, pierce the first wall they hit and destroy themselves on the second, which means cover matters but isn't guaranteed. Corridor missile launchers cycle between safe windows and bursts of 2-3 rockets per pass — learn the rhythm or die. And scattered through every level, random stray projectiles cross the map without warning: most leave you at 1% HP, but a random fraction heal you instead.

The AI companion is not decoration. It follows you using real BFS pathfinding over the grid — it routes around walls, not through them. It fights with its own katana, throws grenades and gas at enemies, toggles its own flashlight strategically based on the situation, cuts through breakable walls when the path is blocked, retreats to healing rooms when low on health, and revives itself at half HP. It also talks — 25 contextual lines tied to real in-game moments, delivered in comic-style speech bubbles: ambient chatter, reactions to falling, sarcasm when you take a hit, specific lines for the antidote and alarms. It feels like a partner, not a follower.

The multiplayer is real. Up to 5 players can join the same Reddit post and play together in genuine co-op. Positions sync via Devvit Realtime. Shared missions — generator repairs, gas leak containment — require actual team contribution and are coordinated through Redis so they count only once. Victory is collective: the exit doesn't open until every active player arrives. And the subreddit leaderboard doesn't just show names and scores — it shows each player's custom color, their hand-drawn avatar, and their chosen profile name. When a run breaks into the top 3, the game automatically posts a comment in the Reddit thread announcing it. The community knows.


🔧 How We Built It

Blackout runs on Phaser 3.90 with Arcade Physics as the game engine, handling all gameplay logic in the browser: scenes, physics, rendering, input, pathfinding, collision, and every visual element on screen. We set ourselves a rule early on and never broke it — no external asset files. Every sprite in the game is drawn in code using Phaser.GameObjects.Graphics. Every sound is synthesized in real time using the Web Audio API — oscillators, noise generators, envelopes. The narrator voice that plays on the intro screen uses Web Speech API. Nothing is loaded from a file. Nothing is downloaded. The game is entirely self-contained.

The architecture has a clean separation that made development dramatically easier. Phaser lives in src/client/ and is completely independent of Devvit — it runs in any browser, with zero Reddit dependency. When running outside Reddit, API calls fail silently and the game falls back to full local mode with localStorage. Devvit lives in src/server/, using @devvit/web/server, and is responsible for everything that makes the experience a Reddit experience: hosting the interactive post, Redis persistence, Realtime multiplayer sync, and Reddit API integration. The two layers connect through fetch('/api/...') calls — simple, testable, and fault-tolerant.

Persistence is layered deliberately. localStorage handles everything that should survive a browser refresh in standalone mode — ammo, progress, settings. Redis handles everything that needs to follow your Reddit account across devices and sessions — diamonds, max level unlocked, achievements, inventory, outfits, energy shield percentage, and login streak. Your progress is yours, not your device's.

The daily spin wheel, login streak rewards, diamond economy, and shop inventory are all Redis-backed. The subreddit leaderboard stores not just scores but full player identity — color, drawing, name — and is queryable per community, meaning different subreddits have their own independent rankings.

TypeScript covers both client and server. Vite bundles the client. esbuild compiles the server. The build pipeline is fast, clean, and produces a single deployable package that Devvit hosts entirely within Reddit's infrastructure.


🧗 Challenges We Faced

Multiplayer inside a Reddit post is not a solved problem. Devvit Realtime is a powerful primitive, but building a fluid co-op experience for 5 simultaneous players — each moving, shooting, triggering hazards, and contributing to shared objectives — required careful decisions about what to sync and what to keep local. We settled on a clear rule: local state (position, animation frame, flashlight status) is simulated client-side for responsiveness and only broadcast for others to display. Server state (mission progress, leaderboard entries, inventory, shared objectives) goes through Redis and is the single source of truth. Keeping these two worlds cleanly separated prevented an entire class of race condition bugs that haunted early builds.

Zero external assets started as a philosophical choice and became our hardest technical constraint. Every visual in Blackout — character bodies, monster designs, weapon sprites, explosions, UI components, floor tiles, obstacles, projectile trails — had to be expressed as a sequence of Phaser Graphics API calls. There is no art pipeline. There are no texture atlases. There are no sprite sheets. This forced us to develop a small internal drawing system that could express complex shapes consistently, and it produced something unexpected: a visual style that is completely our own, loads in zero time, and scales cleanly to any screen resolution. We wouldn't take it back.

The hunter turret collision model exposed a gap in Phaser's Arcade Physics. Arcade Physics doesn't support per-object wall-piercing rules — it's all or nothing for colliders. Hunter turret bullets needed to pierce the first wall they hit but be destroyed by the second. We solved this with a custom collision handler that tracks each bullet's pierce count independently and intercepts the physics resolution before Arcade can process it normally. It's one of those solutions that looks obvious in hindsight and took two days to reach.

The BFS bot pathfinding on a dynamically changing grid — where walls can be destroyed mid-run by the player or the bot itself — required a pathfinding implementation that could recompute routes cheaply on every significant map change. We ended up with a lightweight BFS that runs on the game's logical grid (not the pixel layer), triggered by wall destruction events, and caches results until the next map mutation. It's not A*, but it's fast enough that the bot always feels responsive and never visibly recalculates.

Synthesizing footstep audio that feels natural was surprisingly hard. The Web Audio API gives you oscillators and noise — not footsteps. We ended up modeling each step as a short noise burst with a custom amplitude envelope, pitched slightly differently per surface type, timed to actual player velocity rather than a fixed interval. When you slow down, the footsteps slow down. When you dash, the rhythm breaks. It sounds simple. It took three iterations.


📚 What We Learned

The most important thing we learned is that Reddit's comment section is an underused game mechanic. When Blackout auto-posts a comment because someone just cracked the top 3 leaderboard, something remarkable happens: the community reacts. People congratulate, challenge, accuse each other of cheating, post their own attempts. That moment costs us zero lines of game code — it's just a Reddit API call — but it generates more genuine community engagement than any in-game feature we designed deliberately. We should have leaned into this even harder, and we will in future updates.

We learned that procedural audio is a legitimate creative direction, not a fallback. Because every sound in Blackout was designed from scratch rather than sourced from a library, the audio palette is internally consistent in a way that sampled audio rarely achieves. The footsteps, weapon sounds, monster cues, and the bot's voice lines all come from the same tonal world. Players have described the audio as "eerie" and "weirdly fitting" — which is exactly what we were going for, and exactly what we could not have achieved by mixing licensed samples.

We learned that the best retention mechanic is a reason to come back that feels earned, not forced. The daily wheel spin and login streak work not because they gatekeep content, but because they give players a ritual. Opening the game each day to spin the wheel, see the streak counter tick up, and collect the bonus before starting a run is a two-minute interaction that takes almost no development effort and has an outsized effect on daily return rate. Simple systems, compounding over time.

And we learned that building for Reddit means building with Reddit's grain, not against it. Reddit users are opinionated, community-driven, and deeply skeptical of anything that feels corporate or imported. Blackout's identity — 100% handcrafted, no borrowed aesthetics, no familiar vocabulary from other games — resonated precisely because it felt like something that could only have come from this community and this platform. That wasn't an accident. It was a design decision we made on day one and defended every time it would have been easier to reach for an existing asset or a familiar mechanic.


🏆 How Blackout Addresses the Judging Criteria

Engaging user experience with interesting design and themes: Blackout has a visual and audio identity that is entirely its own — zero external assets, 100% procedural. The fog-of-war tension, the dying flashlight, the companion bot's personality, and the escalating floor architecture create an experience that is immediately distinctive and consistently surprising. Every run feels different because every map is different. Every playthrough reveals a new combination of hazards, shortcuts, and moments.

As close to publishable as possible: Full Spanish/English localization. Automatic PC/mobile detection with on-screen controls for touch devices. Flashcard tutorial on first launch. Settings screen with audio mute and progress wipe. Persistent cross-device progress via Redis. Graceful standalone fallback for testing outside Reddit. Blackout is not a demo or a prototype — it is a complete, polished game.

Reddit community focus: Co-op for 5 players inside a single post. Shared missions that require real team coordination. A subreddit leaderboard with user-generated identity (hand-drawn avatars, chosen colors, profile names). Auto-comments on top-3 runs that make the community a witness to great moments. Blackout uses Reddit as infrastructure, not just as a host.

Best retention mechanisms: Daily wheel spin with login streak bonuses. Diamond economy with meaningful purchases. Persistent inventory that survives between sessions. Ten levels of escalating difficulty with procedural generation ensuring no two runs repeat. Achievements with a dedicated panel. Every session leaves the player with something — progress, diamonds, a new high score, or just the knowledge of exactly which floor they need to beat next time.

Best use of Phaser: Phaser 3.90 with Arcade Physics drives the entire client. Custom collision logic for hunter turret wall-piercing. BFS pathfinding for the AI companion. Procedural sprite generation for every visual element. Synthesized audio coordinated with Phaser's game loop for footstep timing. Squash/stretch procedural character animation without spritesheets. Blackout pushes Phaser into territory it wasn't explicitly designed for — and it holds up.

Built With

Share this project:

Updates

Submission history