Inspiration

I wanted the subreddit itself to be the level. A Reddit post already has an author, a crowd and a clock, so in MARSENTINEL every post is a crewed ship: one player builds it, everyone else hunts it, and the comments keep score.

I picked a crew sim over a pure shooter on purpose. Comparing game subreddits, I found that sim players post about six times as much per player as action players do. A door that jams open, a compartment that loses its air, a crew member who reaches the last gun: those are stories people want to tell, and Reddit is where they tell them.

What it does

MARSENTINEL is a crew sim that lives in a subreddit. Every post is a crewed ship on a clock, and the subreddit has until it runs out to take it apart.

Today's watch

  • Every day at 00:00 UTC the app posts the next watch from the moderators' queue as Watch #N, with WATCH flair.
  • A watch fixes one ship and three to five enemy ships, called answers. Everyone flies that ship against the same answers, one at a time. Damage and lost crew carry over, for at most three minutes.
  • The start screen shows the watch number and date, how many players have stood it, your streak, and the answers in order.
  • The result card shows how the watch ended, crew aboard, and the share of players who ended the same way, like 25% OF 12 ENDED AS YOU DID. Only your first run on a post counts.
  • TODAY'S WATCH #N > in any post's lobby plays the newest watch in place. Older watch posts still play.
  • Moderators queue watches from the subreddit menu. A new day needs no app update.

Post a sentinel

  • In the hangar, tap bulkheads, doors, engines, guns and crew onto a grid. Each sealed compartment is a life.
  • Post it under your name for 24 hours, staking its price in credits. Anyone in the subreddit can hunt it until the deadline.
  • The first hunter to down it takes the stake. If nobody does by the deadline, the stake comes home and the flair turns from LIVE to SURVIVED.
  • When no player's sentinel is live, the app posts an ownerless, week-long FACTORY sentinel.

Hunt

  • Hold the left or right half of the screen to turn. Guns aim and fire on their own while the crew keep them running.
  • Tap a sentinel's compartment to focus fire there.
  • Players start with no credits. Hunting earns the first ones.

Built for Reddit

  • A sentinel is a post. The app pins a KILL LOG comment on it counting who tried and who downed it.
  • A watch is a post too, one a day, so the subreddit feed becomes the archive of past watches.
  • COMMENT MY KILL and COMMENT MY WATCH draft a comment in your own words, with a result line under it. Nothing is sent until COMMENT AS ME.
  • MAKER FLAIR shows your maker level as user flair, only after you choose SHOW IT.
  • A streak counts the days you fly, watches included.
  • Runs are reported to Devvit Journeys, without names or text. Each watch run is its own journey.

What changed during the Submission Period

MARSENTINEL was live on Reddit before this hackathon. Its last earlier update (0.13.1) entered App Review on Nov 11 at 13:48 UTC, before the Submission Period opened at 20:00 UTC, so it is not counted here. Everything below was built after the period opened, as version 0.14 (60 files, about 4,300 lines added):

  • Today's watch, a new daily mode: one ship and three to five answers, the same for everyone, flown one after another with damage and lost crew carrying over.
  • A moderator queue in the subreddit menu, and a scheduler that posts the next watch every day at 00:00 UTC.
  • A watch start screen, and a TODAY'S WATCH #N > entry in every post's lobby.
  • A result card with crew aboard and the anonymous share of players who ended the same way. Only each player's first run on a post counts.
  • COMMENT MY WATCH, watch days in the streak, and a Devvit Journey per watch run.
  • A headless sweep that flies a candidate lineup 24 times, to pick lineups whose outcome can go either way.

How I built it

  • Client: Rust and Bevy, compiled to WebAssembly and drawn with WebGL2. Physics is avian2d. The same code runs in a native window for QA.
  • Server: TypeScript on Devvit Web, with per-installation Redis and a job each minute that settles expired sentinels and posts the day's watch.
  • A headless build of the same sim runs matchup sweeps. A new rule ships only if the player's input changes the result.

Challenges

  • A daily game that cannot ship a build a day. Every new build waits for App Review, so a day's content lives outside the build: a watch is a ship and three to five answers, picked by name and stored with the post.
  • Fair comparison across devices. The sim is deterministic only in the native build; on Reddit, frame length varies by device. So players compare crew aboard and answers downed, not seconds.
  • One button, one action. Every post or comment the app makes for a player sits behind its own confirmation.

What I learned

  • Measure content before you ship it. On paper most lineups looked fair. The headless sweep showed that only a ship with crew in two or more compartments let the crew's handling change the result; none of the other ships I measured changed it against any of twenty enemies.
  • Every lineup that chained two of the strongest enemies lost the ship in more than half its runs. A good watch puts one strong enemy on top of lighter ones.

How to test

  1. Open the demo post linked in this submission. It is a Watch #N post on r/marsentinel.
  2. The rules card names today's watch. GOT IT opens the start screen.
  3. STAND THE WATCH starts the run. Hold the left or right half of the screen to turn. Guns aim and fire on their own.
  4. The result card shows how many players ended the same way. COMMENT MY WATCH previews a comment; nothing is posted until COMMENT AS ME.
  5. BACK TO LOBBY lists live sentinels to hunt. Posting your own needs credits, and hunting earns the first ones.

Built With

  • avian2d
  • bevy
  • devvit
  • rust
Share this project:

Updates

Submission history