Alex Weisberg
← Apps
Live2026ashenforge.forgerating.com

Ashenforge

A dark-fantasy, high-score roguelite in the browser: build a character, draft loot, and out-strategize a boss gauntlet for a spot on a shared global leaderboard. Runs are short, every choice is legible, and a daily shared-seed challenge puts everyone on the same run.

Ashenforge screenshot

Why I built it

A self-contained browser RPG built around a tight, repeatable loop: allocate a stat pool into an archetype, draft equipment from randomized offers, then fight a sequence of bosses where each encounter is a risk/reward decision, submitting your final score to a global leaderboard and a shared-seed daily challenge.

Problem it solves

Most browser games are either shallow clicker loops with no depth, or heavyweight engine builds that are slow to load and hard to maintain. I wanted to prove you can deliver a genuinely strategic, replayable ARPG-flavored experience (loot, builds, matchups, leaderboards) as a fast, dependency-light static site with a real backend for shared competition, without a game engine or a traditional server.

Research

The design started from a tension: ARPG depth (build identity, named loot, risk/reward) is compelling but heavy, while quick web score-games are frictionless but shallow. Ashenforge keeps every mechanic in service of replay, and caps how long a run takes. Difficulty tiers and boss matchups give the run identity. A daily seed and a rotating hot boss give people a reason to come back. A leaderboard makes it social.

Solution

I built the game rules in TypeScript with Cursor instead of dropping in a heavy game library I didn’t understand. A React UI sits on top. The site hosts on Cloudflare Pages, with small serverless functions and storage for the global leaderboard. The same starting seed means a daily challenge can be identical for every player, and a run can be repeated the same way. Randomness is meant to feel generous but fair: loot you can actually equip, no duplicate offers, win chance shown before you commit, and a timed strike so skill can matter, not only luck.

Key features

  • Build-first character system: a fixed stat pool, archetype starter packs, and gear requirements that make STR/DEX/VIT/ENE meaningful.
  • Transparent two-axis combat: offense vs. boss toughness and defense vs. boss threat, with a live win-% readout, boss traits, matchup bonuses, and risk/reward fight beats.
  • Timed-strike skill layer: a “sweet spot” meter injects hand-eye skill into each fight for a pure-upside win-chance bonus on a well-timed hit.
  • Loot with identity: weighted rarities, rolled affixes, magic find, named legendaries, and boss signature drops; offers are always wearable, never duplicated, and named by rarity tier.
  • Global + daily leaderboards: a best-per-player-per-mode board and a shared-seed daily board, visible to everyone.
  • Client-first & offline-friendly: plays fully offline with local persistence, then syncs to the global board when online.

Architecture

Game rules live in one place (combat, loot, power, and the random rolls), separate from the screens you see. Bosses, gear, affixes, uniques, and difficulties are data the rules read, not hard-coded into the UI. The UI never rolls its own dice; it asks the rules engine, so the same starting seed produces the same run for every player. That is what makes the daily challenge fair and repeatable. App state is updated in one clear flow, and things like win chance and build previews are calculated from that state so the screen stays consistent. Leaderboards run through small Cloudflare functions that store best scores by player and by day, with basic checks on what gets saved. If those functions are unavailable, the game still plays on your machine and syncs later. Each run also keeps a step-by-step log with the score, so later I can check that a submitted run actually followed the rules.

Screenshots

Ashenforge home and difficulty select
Draft your gear. Spin fate. Outlast the gauntlet.

Challenges

  • Making combat repeatable from the same starting seed so daily challenges are identical for every player.
  • Keeping randomness generous but fair: loot you can actually equip, no duplicate offers, and win chance shown before you commit.
  • Putting a real shared leaderboard on a simple hosted site, with a clean offline fallback when the network isn’t there.

Lessons learned

  • Keeping the game rules separate from the screens, and starting from the same seed, makes combat repeatable, easier to test, and easier to rebalance by changing data instead of rewriting the UI.
  • Showing the win chance before you commit makes randomness feel fair instead of arbitrary.
  • Make the game playable on your machine first, then add the shared leaderboard when you’re online. That removes signup friction and avoids needing an always-on game server.

Future improvements

  • Use each run’s step-by-step log to check that submitted scores actually followed the rules.
  • More bosses, gear affixes, unique items, and chase content to deepen builds.
  • Seasonal daily challenges, clearer leaderboard views, and shareable run recaps.

How it’s offered

Free browser game, no install and no login. Play a short run, climb the leaderboard, or come back for the daily shared-seed challenge.