Inspiration

The starting point was a paper field map: something that gets passed around, picks up marks, and still makes sense to the next person. I wanted the route to feel loose while it was being drawn, but I did not want arbitrary sketches published into a shared Reddit surface. Echo Atlas turns that route into a small piece of verified territory instead.

What it does

Each expedition gives you 75 seconds. You steer a coral line from a frontier lantern, loop around relics, avoid moving ink, and bring the line home. A valid closed loop claims territory. Two flares buy a little space when the ink gets close.

Filing a route is the day's commitment. The server checks it before captured cells reach the atlas, and a completed result cannot be replaced until the next UTC day. An expired unfinished run can be restarted. Practice remains unlimited after filing without touching the shared map.

The map follows a deterministic six-day fold cycle, changing the number and speed of relics, hazards, and islands. Players join Lantern, Needle, or Moth, with each new cartographer assigned among the smallest crews. Crew Watch and the leaderboard stay hidden until six people have filed. After that, neutral rank labels appear instead of Reddit names or IDs.

A filed run also opens Convergence, an asynchronous loop-capture raid. Joining creates a fresh anomaly if none is active or the previous one has sealed, escaped, or expired. The personal journal keeps streak, territory, relic, and anomaly totals in Redis. A player-facing journal and weekly folio do not ship in 0.0.26; both remain future work.

How we built it

Phaser handles steering, moving ink, loop capture, flares, relics, and the Convergence arena. React and TypeScript handle the briefing, HUD, results, sigil choice, return states, and optional field-report action.

The Hono server runs on Devvit Web. Redis holds daily maps, attempts, checkpoints, scores, journals, sigils, archives, and short-lived claims. Devvit Scheduler rolls the atlas at UTC midnight, and Realtime notifies open clients after saved map changes and standings updates.

The browser never gets to award itself a route. The validator checks the run token, owner, expiry, sample count, timestamps, movement speed, bounds, duration, loop shape, flare use, captured objects, and score. State is written before any Realtime update is sent.

Scoring counts unique cells, relics, and hazards rather than repeated overlaps. Square-root territory returns keep large loops worthwhile without letting one low-risk perimeter sweep overwhelm compact discovery routes. Realtime remains best effort: rejection or timeout cannot roll back an accepted finish.

Challenges

The awkward part was keeping the line freehand without turning the atlas into an unrestricted drawing wall. The route is sampled and simplified, then replayed on the server. Only its claimed cells become public.

Finishing also had to remain safe when requests arrived together. Two requests must not bank the same run twice, and two cartographers finishing at once must not overwrite each other's territory. Unfinished routes still needed to survive a refresh, while a filed route had to stay final for the day.

Retry exposed a second lifecycle problem: destroyed Phaser scenes could keep global controls alive. Cleanup now runs on both shutdown and destruction, finished scenes ignore later controls, and every finish event is tied to its run session before React accepts it. Review is now an explicit saved-field state rather than a frozen playfield with live controls.

Accomplishments

My favorite moment comes after filing, when the loose coral line settles into the map. The motion feels immediate, but the public result has passed the same checks as every other contribution. That one action updates territory, crew score, and the personal journal without requiring a live multiplayer session.

What we learned

The moving line and the public artifact do not have to be the same thing. A route can feel personal while it is being drawn; the community can inherit a small, structured patch of map.

Realtime also works better here as a notification layer than as storage. If a broadcast fails, the saved atlas survives and a refresh recovers it.

What's next

I would add genuinely different biomes, another ink behavior, a player-facing journal and weekly folio (neither ships in 0.0.26), and better moderator inspection for accepted contributions. Convergence could use a second phase. Any audio would start muted, and fold difficulty should be tuned from real play.

Built with

Devvit Web 0.13.8, Reddit custom posts and User Actions, React 19, TypeScript, Phaser 4.2, Hono, Redis, Realtime, Devvit Scheduler, Vite, Vitest, Playwright, Testing Library, ESLint, and Prettier.

Four project-specific illustrated journal assets are recorded by filename in ASSET_LICENSES.md as AI-assisted art. The route, territory fills, effects, controls, and interface are original React, CSS, and Phaser work. No AI model or LLM runs inside the game.

Significant hackathon updates

During the hackathon I built the expedition, server route replay, atomic territory updates, three balanced crews, privacy-gated standings, sigils, persistent journals, scheduled rollover, Realtime notifications, retryable unfinished runs, practice after filing, and the on-demand Convergence raid. I also tightened movement validation, added lifecycle-safe retry and saved-field Review, balanced unique-discovery scoring, and stress-tested overlapping finishes and failed Realtime delivery.

Built With

Share this project:

Updates