Inspiration:
An old school 90s Mac game called Escape Velocity. Talk about a good game ahead of its time... if you played it you'd know. What better way to use Subreddits.
I’ve been developing a larger Phaser project called Mentaverse: Ethercrash, linked below. It is a full MMO space adventure built entirely with Phaser. I used ideas and systems from that project as inspiration for this Reddit game, and all of the ship assets come directly from my original starter fleet. They felt like the perfect fit for Shroud Signal.
The Shroud Signal gives it coordinates and even bragging rights... that is if you win the challenge. Every subreddit becomes a sector you can fly in, with everyone else whos in the post. Wanna test your subreddit's skills? Challenge another subreddit to a Subreddit vs Subreddit battle to the last ship still in one piece.
What it does:
Turns a subreddit into a sector of space.
Hit "Chart a New Sector" in the subreddit menu and it makes a post. Open it and you spawn a ship.
Hit "Start a Skirmish" to start a 5v5 or 10v10 Subreddit Skirmish, Generally open to all members of that Subreddit unless set to Whitelist, then only people on the Whitelist will be able to join the Skirmish while everyone else that joins will be spectators.
Hit "Challenge a Subreddit" to start a challenge that the other subreddit can agree to or change some terms to something both parties agree on. Then the challenge is on.
Five Ship Types:
Fighter, Miner, Transport, Pathfinder (Scout), Tender (Rescue). Each ship has its own useful perk, type of weapon and special function in the fleet (see below). You fly it in real time next to everyone else who has the post open, or play against the subreddit in a skirmish or skirmish as practive for the Subreddit vs Subreddit space battle challenges.
Shroud Signal: Battle Arena Ship Specifications
Fighter
Hull: 80 (0.8×) Speed Multiplier: 1.2× Damage Multiplier: 1.15× Primary Weapon: Laser Weapon Damage: 14 Cooldown: 350 milliseconds Range: 420 units Secondary Weapon: Torpedo
Ability: Overcharge
Ability Cooldown: 20 seconds
Increases all damage dealt by 50% for 5 seconds.
Constants:
OVERCHARGE_DAMAGE_MUL = 1.5
OVERCHARGE_DURATION_MS = 5000
Miner
Hull: 110 (1.1×) Speed Multiplier: 0.9× Damage Multiplier: 1.0× Weapon: Autocannon Weapon Damage: 14 Cooldown: 230 milliseconds Range: 400 units
Ability: Deploy Mine
Ability Cooldown: 16 seconds
Drops a proximity mine at the Miner’s current position. The mine activates when the first enemy enters its 70-unit blast radius and deals 55 torpedo-tier damage.
Allied ships do not trigger the mine.
Constants:
MINE_BLAST_RADIUS = 70
Mine damage baseline: 55
Transport
Hull: 110 (1.1×) Speed Multiplier: 0.75× Damage Multiplier: 0.85× Weapon: Burst Weapon Damage: 30 Cooldown: 500 milliseconds Range: 340 units
Ability: Bulwark
Ability Cooldown: 18 seconds
Reduces all incoming damage by 40% for 4 seconds.
Constants:
BULWARK_DAMAGE_MUL = 0.6
BULWARK_DURATION_MS = 4000
Pathfinder
Hull: 90 (0.90×) Speed Multiplier: 1.3× Damage Multiplier: 1.3× Weapon: Plasma Weapon Damage: 30 Cooldown: 650 milliseconds Range: 440 units
Ability: Radar Ping
Ability Cooldown: 15 seconds
Reveals the enemy ship’s current hull to the entire allied team for 6 seconds.
Radar Ping is a team-wide reconnaissance ability rather than a reveal visible only to the Pathfinder.
Constant:
RADAR_PING_DURATION_MS = 6000
Tender
Hull: 110 (1.1×) Speed Multiplier: 0.9× Damage Multiplier: 0.8× Weapon: Flak Battery Weapon Damage: 38 Cooldown: 600 milliseconds Range: 260 units
Ability: Repair Beam
Ability Cooldown: 15 seconds
Heals the nearest allied ship within 300 units for 45 hull.
Healing cannot exceed the target ship’s maximum hull.
Constants:
TENDER_HEAL_AMOUNT = 45
TENDER_HEAL_RANGE = 300
Flak Battery Point Defense
The Tender’s Flak Battery also functions as an anti-torpedo point-defense system.
When an incoming enemy torpedo enters the 260-unit interception range, the Flak Battery prioritizes destroying the torpedo instead of firing its normal shotgun-style attack.
Constant:
FLAK_INTERCEPT_RANGE = 260
Shared Combat Constants
Torpedo
The torpedo serves as the Fighter’s free-play secondary weapon and establishes the damage baseline used by Miner proximity mines. Damage: 55 Cooldown: 900 milliseconds Range: 640 units Travel Speed: 600 units per second Impact Radius: 100 units
Squad Presets
Balanced
A mixed squad containing two ships from every ship line.
- 2 Fighters
- 2 Miners
- 2 Transports
- 2 Pathfinders
- 2 Tenders Total: 10 ships
Aggro
An offensive squad focused on direct damage, rapid attacks, and sustained weapon pressure.
- 6 Fighters
- 4 Miners Total: 10 ships
Turtle
A defensive squad focused on durability, damage mitigation, and repair support.
- 7 Transports
- 3 Tenders Total: 10 ships
Recon
A reconnaissance and area-control squad focused on mine deployment and team-wide enemy tracking.
- 6 Miners
- 4 Pathfinders Total: 10 ships
Use strategy and team work to win the challenges whether you chose a prebuilt squad or are rollin custom. Every kill and every hit climbs a leaderboard across the whole subreddit.
Mods can also challenge another subreddit outright. Set a player cap per team and a warm up window, a preset ship squad or roll with custom squads. The other subreddit accepts or counters, and once it's on both subreddits get synced arena posts for a best of 3 Last One Standing series. Get eliminated and you're out for the rest of that round. Tie a round and it comes down to who lasted longest across the whole series.
Every 5 minutes a galaxy pulse fires and drops a lore fragment into every active sector. A rumor about the Shroud. A lost convoy. A signal nobody can trace.
How I built it:
Plan was to run multiplayer off a cloudflare worker I already had. Websocket server. I wired up devvit web and wrote a spike to test the connection from inside the webview.
Devvits webview has a csp that only allows connect-src to reddits own domains. No external fetch. No external websocket. I checked the browser console and every request to the worker got blocked before it left the page.
So I dropped the external backend and rebuilt multiplayer on devvits own primitives. @devvit/redis holds per-sector player state. position, rotation, hull, score. a hash keyed by sector, plus a sorted set for the subreddit leaderboard.
@devvit/realtime replaced the websockets. realtime.send() on the server, connectRealtime() on the client. same origin, so csp is fine. Broadcasts join, move, leave, score and pulse to every pilot in the sector.
@devvit/scheduler runs the galaxy pulse. Cron task in devvit.json, hits an internal endpoint every 5 minutes, reads a sorted set of active sectors, fans a line out to each one.
Phaser draws the sector. flight physics, starfield, remote ship interpolation, hud, leaderboard overlay. No login. No accounts. No database. context.userId and context.username come from devvit. The whole game runs inside the post.
Challenges we ran into:
csp. connect-src is locked to reddit domains. That kills any external backend. I had to rebuild the multiplayer layer instead of reusing the one I had.
Permissions default to false. Devvits manifest defaults redis and realtime to false. I had the server logic written before I found it in the raw json schema. Without the fix, every redis write and every broadcast fails silently. No error anywhere.
No undefined. Devvits shared types dont allow undefined in realtime or stored payloads. Only null. I had to swap every | undefined for | null.
Testing inside the sandbox. Headless browser couldn't get past reddits bot challenge on the playtest url, and it wasn't logged in as a real account anyway. So csp discovery and all the verification came from opening playtest links in a real logged in browser and reading the console.
Accomplishments that we're proud of:
Real time multiplayer with no server to worry about No hosting, No database, No deploy. it all runs on Reddit.
I found the csp wall and rebuilt the whole netcode on devvit primitives inside the hackathon window. No login screen. You open a post and you're already flying.
Every subreddit gets its own sector.
What we learned:
Devvits constraints pick the architecture for you. csp kills external backends, So multiplayer has to be @devvit/realtime and @devvit/redis.
What you end up with is a game with no external deps, no hosting and no database.
For anyone else building on devvit: Check the manifest permission defaults before you write server logic.
What's next for Shroud Signal:
- Real objectives
- Mining nodes
- Pilot vs pilot
- Ship upgrades and pilot progression that carry between sectors
Built With
- biome
- devvit
- esbuild
- node.js
- phaser.js
- redis
- typescript


Log in or sign up for Devpost to join the conversation.