Inspiration

In 2008, a French browser game called La Brute hooked millions of players with a simple idea: you don't control your fighter, you raise it. You pick its stats, it gets stronger, and you watch it fight on its own. Every fight is short, funny and easy to read.

I wanted to get that feeling back, but on a phone, and to go deeper with RPG elements and customisation - the original inspiration was all just randomness for everything, but was still as addictive as frustrating.

What it does

BrawlFast is an auto-battler RPG. You create a fighter and spend your stat points (HP, Strength, Agility, Luck). Then you watch every fight play out (turn-based). You can have up to 5 fighters in your roster.

  • PvP Arena (async): fight other players' fighters. Your own fighter defends while you're away and earns XP when it wins
  • Story mode: 6 painted zones, 65 stages, a boss at the end of each
  • The Gauntlet: a 50-round weekly ladder. HP carries over between rounds, a Guardian (boss) waits every 5 rounds, and there's a weekly leaderboard.
  • Weekly boss, daily quests, a daily modifier that changes the rules for everyone.
  • The Stronghold: buildings that upgrade your whole roster.

BrawlFast Premium (one-time purchase) unlocks 5 roster slots and one extra Arena fight a day. It's convenience more than power or a real advantage: a free player can reach everything.

How we built it

  • Expo SDK 57 / React Native 0.86 (New Architecture), TypeScript, Expo Router, Zustand
  • Fighters are 2D cutout rigs drawn with Skia. We generated one painted turnaround per class (from PNGs generated with GPT Image 2), then wrote a Python pipeline that mattes it, cuts it into parts along the ink lines, and skins it onto a skeleton. At runtime a clip library animates all rigs
  • Deterministic combat engine: seeded RNG, so a fight is fully reproducible from its seed and both fighters
  • Supabase for matchmaking, leaderboards and PvP defenders
  • RevenueCat for Premium
  • EAS Build + EAS Update for over-the-air content updates
  • Art and sound: GPT Image for the painted masters (classes, maps, buildings, items) and ElevenLabs for the sound effects. Everything is post-processed and optimised by our own tooling

Challenges we ran into

I have some experience with UX/UI mainly on web/SaaS projects, and I have built other mobile apps, but this is my first mobile game. And many elements are clearly different in terms of UX/UI, gameplay obviously, but also the reward loop, dopamine etc. On top of that:

  • Making auto-fights feel alive. Our first fights looked like two cards sliding into each other. We rebuilt the choreography around the rigs: strike distances measured on each class's painted outline, run-ins as bounds instead of sliding feet, impacts, camera tilts and sounds all landing on the exact contact frame
  • Timing on the UI thread. Driving moves through React state made every blow 100–400 ms late. Moving commands to Reanimated shared values made the choreography frame-accurate
  • Performance. Skinning a fighter cost 13 ms per frame on a flagship Android phone. Coarsening the meshes and merging them into a single draw per fighter brought combat back to a smooth frame rate.
  • Balance without guesswork. A 30-day simulation on the real engine showed coin income collapsing once the map was cleared, so we added per-fight coins with anti-grind caps. The Gauntlet curve is tuned by simulation in unit tests, not by feel

What we learned

  • Readability and simplicity is often better: every effect had to earn its place without hiding the fight
  • Wait for real signals, not timers. Screens, sheets and fights now wait for the previous transition to actually finish, which fixed a whole class of iOS presentation bugs
  • Measure before you "optimize": several perf ideas made things worse on a real device and were reverted

What's next

Considering real-time auto-battles (instead of turn-based) for more possibilities. More traits and status effects (bleed, poison), new weapon families that change fighting range, epic gear, revenge matches, and seasonal PvP leagues

Built With

Share this project:

Updates

Submission history