The challenge
Every established company has one: the 2018-era app that works, makes money, and nobody dares touch. ArenaMaster — my own World of Warcraft arena and RBG rankings platform, live since 2018 with a public in-game addon feeding it data — was exactly that. Modernizing it meant:
- A 2018-era Rails + react-on-rails monolith with years of accumulated dependencies
- A live community expecting rankings and character profiles to keep updating daily
- Rebuilding the frontend and API contract without breaking the public WoW addon
- Migrating hosting providers while the platform stayed up
The approach
This one is my own product — which makes it the most honest case study on this site. It shows how I run a legacy modernization when I'm the one paying for the downtime: incrementally, verified at every step, with the app running throughout.
Stack modernization
- Split the monolith into a Rails 8 / Ruby 3.3 JSON API and a Next.js 16 / React 19 / TypeScript / Tailwind v4 frontend, organized as a monorepo
- Sidekiq workers for data ingestion and AnyCable websockets for live updates
- PostgreSQL and Redis carried over with schema and job migrations, not rewrites
- The public in-game addon kept its contract — players never had to update a thing
Hosting migration
- API and websockets moved to Kamal 2 deploys on Hetzner
- Frontend moved to Vercel with the Next.js rebuild
- Staged cutover with the community online throughout
The results
- 8 years in production and still serving its competitive community daily
- 2018-era monolith replaced with a modern Rails 8 + Next.js 16 monorepo
- Hosting re-platformed to Kamal 2 on Hetzner plus Vercel
- The public WoW addon kept working through the entire rework
Stack
- Ruby on Rails 8
- Next.js 16
- React 19
- TypeScript
- Sidekiq
- AnyCable
- Kamal 2
- PostgreSQL