Shifting from Unity to React Native, a subtler visual theme, a unified TypeScript backend, a finished 2D art direction, and moving from prototyping into real implementation.
Hello everyone! This has been the biggest update yet, spanning several months of work across the client, website, and backend. Here is everything that changed.
From Unity to React Native
The mobile client has been rebuilt from the ground up, moving away from Unity to React Native. This was not a small decision, but I believe it is the right one for where the project is heading.
React Native gives the app that native, "at home on your phone" feeling that a Unity-based game shell never quite achieves — smoother navigation, familiar platform conventions, and faster iteration. On top of that, it opens the door to something I have wanted for a while: letting users build and run their own mini-apps inside the client, each one sandboxed in its own isolated JavaScript runtime for safety. I had explored building this on top of Unity's UI Toolkit, but its limitations made it a much harder fit for flexible, user-defined mini-apps compared to what React Native makes possible.
A Subtler Visual Theme
Alongside the client rewrite, the website and client have both received a full theme refresh. I moved away from the more vibrant colors of earlier versions toward a cleaner, more subtle look with simplified layouts.
This was made possible with the help of shadcn and tweakcn — if you are curious about the exact palette, you can find it here: tweakcn theme.
A Unified Backend
The backend has been completely reworked, moving from C# to Node.js and Next.js server actions. This unifies the entire codebase — client, website, internal tools, and server — around a single language: TypeScript.
Beyond the language switch, this rework came with a much stronger focus on testing. Test coverage has meaningfully improved across the client, website, internal tools, and server, which gives me a lot more confidence when making changes going forward.
Finishing the Prototype, Choosing 2D
I also wrapped up the 3D prototype work and, based on everything learned from it, settled on a 2D isometric art style going forward. It gives a more detailed and polished look while running noticeably better on mobile devices than the limited 3D approach could.
The React Native client already has a ground-based implementation of the 2D renderer, which has partially proven this approach works well in practice. Because the renderer is built this way, the same scene can also be rendered on the backend, which is both more performant and much easier to implement than doing the equivalent with a 3D scene — and it will be useful for several upcoming features. This also means the scene renderer's codebase can be shared between the client and the backend, instead of maintaining two separate implementations.
From Prototyping to Real Implementation
This also marks a bigger shift for the project as a whole: moving out of the prototyping phase. I have spent a long time experimenting and searching for the best way to represent the project, and I am now confident enough in the direction to begin concrete implementation.
A Word on AI
I want to give a big thanks to Claude, which has sped up a lot of the tedious parts of this work. I am intentionally staying away from "fully vibe-coded" development — I still review, decide, and shape everything myself — but using AI as a tool has let me move noticeably faster.
That is all for this update. Thank you for following along, and I am looking forward to sharing the concrete implementation work as it comes together!