Inspiration

Most games focus on the actions of the player. We wanted to explore a different question:

What happens when the world keeps moving, even when you're offline?

Ashes of the Crown is a persistent medieval world that runs entirely inside a Reddit post. Threats gather, seasons turn, markets shift, rumors spread, legitimacy rises and falls, and the dead do not always stay where they fell, whether a player is watching or not.

A second question became the game's spine: what if a game gave you total freedom of choice, but never freedom from consequence? You can live as a lunatic grass-eater in a ditch, or claw your way to ruling a territory. Either way the world is watching, and it will give you the name you earned.

What it does

Players open the post, name someone, and start living one real day at a time.

  • A living world. A 72-region continent with 16 biomes advances once per real day for everyone. Threats grow and roam. Hunger, unanswered dangers, and stirred-up sentiment erode a ruler's legitimacy. Log in tomorrow and the world has moved without your permission.
  • Two lives per player. An adventurer who risks their body (track, ambush, fish, forage, craft, delve into the dark) and a noble who risks their name (courts, taxes, edicts, bounties, armies, campaigns). Switch between them any time. Your adventurer cannot collect your own noble's bounty; the coffer is not fooled.
  • No numbers, anywhere. No health bars, no XP, no levels. You are Hurt, not "43/100." You are skilled with a blade, not "level 7." The rule is enforced by automated tests: if a raw number ever reaches a player, the build fails.
  • You become what you do. Over a thousand skills, learned only by doing. Sustained habits earn defining nicknames: hunt relentlessly and you are Red-Hands; live on hedge-greens and the villagers will name you the Lunatic Grazer, and word will spread.
  • Permadeath with teeth. Your corpse keeps everything you carried, right where you fell. Another player can recover it. Leave it too long and the Gravewright puts it to work, and the dungeon that killed you grows stronger.
  • A guided first fortnight. Fourteen gentle, optional daily lessons teach the world without hand-holding it. The path survives your death; lessons are learned by a player, not a corpse.
  • A daily reason to stop scrolling. The inline feed card changes every day, driven by that character's morning report.

How we built it

Ashes of the Crown is a Devvit Web app with a strictly server-authoritative architecture.

  • Client: React 19 + TypeScript webview, styled with Tailwind as an illuminated manuscript (Cinzel and EB Garamond, parchment, ink, and gold), including a fully hand-drawn old-world SVG realm map.
  • Server: Hono on Devvit's serverless runtime. Devvit Redis is the single source of truth for all world and character state.
  • Time: a scheduled world tick advances the entire world once per real day, with idempotency guards so it advances exactly once no matter how many requests arrive. Characters catch up lazily on their next visit, so no batch jobs are ever needed.
  • The iron rule: the client never computes anything that matters. Every action resolves on the server, and every response passes through a redaction layer that strips hidden numeric state before it leaves. The client renders words and pips.
  • Art: over a hundred painted assets (biomes, settlements, wildlife, fish, livestock, crops, items, characters) generated with FLUX.2 Pro under a single style system and fixed seeds for coherence.
  • Verification: a local harness swaps Devvit's runtime for an in-memory shim so the full game runs on a laptop, driven by Playwright for automated screenshots at Reddit's real post sizes. Every increment ships behind type checks, lint, unit tests, and visual proof.

Challenges we ran into

The biggest challenge wasn't game mechanics. It was the surface the game lives on.

A Devvit game renders inside a height-locked post in the feed: roughly 320 to 512 pixels tall, as narrow as 344 wide. Our hardest-earned lesson shipped as a production bug: the character creation screen was taller than the locked post, and the "Walk in" button was clipped below the fold inside a no-scroll container. New players literally could not start the game. It passed type checks, lint, build, and even its first regression test, because that test scrolled programmatically in a way no human finger can.

That failure reshaped our entire verification approach:

  • Always test the first-run experience, not just the happy path with data already seeded.
  • Always test at the smallest locked height, not a comfortable desktop window.
  • Assert what a real user can reach with a real mouse-wheel scroll, and prove every regression guard can actually fail before trusting that it passes.

Pacing was the other hard problem. Early players burned through a hard action allowance in seconds, then had nothing to do for a day. We deleted action counts entirely and built a fatigue economy: work tires the body, food and rest restore it, sleep resets it, and safeguards (diminishing skill returns per day, market saturation, cooldowns on a ruler's heaviest levers) keep long sessions from breaking progression or the economy.

Persistent-world consistency was a constant discipline: idempotent ticks, lazy migrations for evolving save formats, and anti-exploit guards the moment players could hold two lives.

Accomplishments that we're proud of

  • A genuinely living world on Reddit's infrastructure, with no external servers or databases.
  • The no-numbers rule held across the entire game, and it is enforced by CI.
  • Permadeath that creates stories instead of ending them: corpses, heirlooms that pass to your next life, and two family lineages per player.
  • A marketing promise ("from lunatic grass-eater to ruler of a vast kingdom") that is literally implemented and literally test-protected: remove the Grass-Eater nickname and the build goes red.
  • A catastrophic onboarding bug found, fixed, and converted into a reusable audit methodology for height-locked webviews.

What we learned

  • Emergent stories beat scripted content. The best moments were never written: a corpse raised into the den that killed it, a nickname that outran its owner.
  • Server-authoritative design is not optional for persistent multiplayer, even at hackathon scale.
  • Qualitative language ("bleeding," "a breath from death") creates more tension than any health bar, and it is enforceable with tests.
  • The screen a new player sees first is the screen most likely to ship broken, because builders never look at it again.
  • AI can dramatically accelerate development, but the discipline that keeps a world consistent (idempotency, migrations, red-to-green regression proof) is still engineering.

The biggest lesson: players invest more when they aren't consuming content but writing history in a world that exists independently of them.

What's next for Ashes of the Crown

  • The daily Chronicle as an automatic community post, so the subreddit itself becomes the world's newspaper.
  • Deeper NPC memory: faces that remember what you did, not just what you're called.
  • The merchant, a third way to live, when the counting houses open their books.
  • Balance tuned by live play: fatigue costs, cooldowns, and market saturation are all named knobs waiting for data.
  • Richer archives, so future players can study, and argue about, the world's past.

The crown may change hands countless times.

The ashes remain.

Built With

Share this project:

Updates

Submission history