MOBA project
A MOBA that runs properly on Linux and does not need a driver in your kernel to trust you. Idea in 2025, building it since 2026.
I played League of Legends from 2023 to 2024. What ended it was not the game, it was Vanguard. In May 2024 Riot rolled its anti-cheat out to League everywhere, and it does not run like a normal program: it is a kernel-level driver, loaded at boot, sitting at the most privileged layer of the machine, running whether or not the game is open.
For fair play, supposedly. For me it was never a cheating question, it was a privacy one. I was not going to hand that much access to my own computer over to play a video game, so I stopped playing.
And once you start paying attention to what your machine is actually running, Windows stops looking great either. So I went distro hopping. Debian, Ubuntu, Zorin OS, Manjaro, and then Arch. Arch is where I stopped and never left. Nothing is on my system unless I put it there, I know what every piece of it is doing, and when something breaks it is mine to fix. That turned out to be exactly what I wanted.
The catch is that there is not much to play. Linux has come a long way, but multiplayer is still where it thins out, and if what you want is a MOBA the list is short enough to count on one hand :')
So one day I thought, fine, I will make one. I spent 2025 designing it and started building it in 2026.
What it is trying to fix
- Kernel-level anti-cheat. Too invasive for what it is. It should not be the price of entry to a game.
- Linux. There is no good MOBA you can properly play on Linux or SteamOS.
- The interfaces. The genre does not really think about user experience. The clients are old, slow and awkward, and everyone has just got used to it.
So: a modern, multi-platform MOBA built around the player experience. Fast updates, clean interfaces, competitive integrity that does not depend on spyware, real Linux and SteamOS support, and privacy-first systems, meaning nothing invasive on your machine and nothing about you being sold on to anyone.
Beyond that there are the things I actually want to play: custom game modes, custom maps and custom win conditions so the community can invent its own reasons to play, a karma system so that behaving well counts for something and behaving badly has consequences, and day, night and weather (rain, thunder, mist) that change how some characters behave mid-match.
Then how do you stop cheating?
You put the truth on the server. The client is not trusted with anything that matters: it sends what you are trying to do, and the server decides what actually happened. It runs a fixed tick loop, simulates the whole match itself, and broadcasts the result. If a client claims something the simulation says is impossible, the claim just does not survive the tick.
The engine is not a 3D engine
I keep calling the Rust part the engine, which is misleading, so to be clear: it does not draw anything. No renderer, no graphics library, no window. It never produces a single pixel. It is a headless simulation and nothing else.
What it owns is the rules. A fixed tick loop runs at 20 ticks a second, so 50ms a tick, and if a tick is ever missed it skips it instead of trying to catch up (falling behind and then sprinting is how you get a match that rubber bands). On each tick it advances the whole world:
- Movement and pathfinding. A* over a grid, with collision that accounts for each entity's radius, so things route around structures instead of through them.
- Combat. Auto attacks, projectiles with travel time, area effects, abilities and their effects.
- The map itself. Minions and their spawners, turrets, the Lifestone, and what happens when any of it dies or gets rebuilt.
- Everything else with a clock. Levels and progression, assist windows, and the day, night and weather cycle.
Then it publishes what changed. The client is on the receiving end of that and simulates none of it: it gets state and events, entity spawned, entity died, structure rebuilt, game finished, and its only job is to turn that into something worth looking at. That part is three.js, driven through React Three Fiber, inside a Tauri window.
So the split is: Rust decides what is true, the frontend decides what it looks like. Which is also the rest of the anti-cheat argument. If the client is not computing anything that matters, there is nothing on your machine worth tampering with, and so no reason for anyone to go policing your machine.
How it is put together
It is a handful of small services rather than one big program, each with its own database, talking to each other over Redis instead of reaching into each other's tables. The bits that have to be fast are Rust, the bits that have to be flexible are TypeScript on Bun.
- account-serviceTypeScript, Bun, Express, Postgres, RedisIdentity. Sign up, log in, tokens, refresh. The source of truth for who you are.
- hub-serviceTypeScript, Bun, Express, Postgres, RedisEverything around a match. Matchmaking, queues, lobbies.
- shop-serviceTypeScript, Bun, Express, Postgres, StripePurchases, kept well away from anything that touches gameplay.
- event-serviceTypeScript, Bun, Socket.IO, RedisThe push channel. Subscribes to the bus and fans messages out to connected clients over WebSockets.
- game-serviceRust, Tokio, sqlx, WebSocketsThe authoritative game server. Tick loop, simulation, pathfinding, drafts, structures, day and night.
- game-clientTauri, React, three.js, ZustandThe desktop client. A Rust shell around a web UI, so Linux and Windows builds come out of the same codebase.
Each service owns its own Postgres, so none of them can quietly depend on another one's schema. Redis carries the events between them. Everything runs in containers, every service has its own CI, and the client is Tauri rather than Electron, which is how Linux and Windows builds come out of one codebase without shipping a browser inside the game.
Where it is now
The backend platform is essentially done. On the game server the skeleton is up too: the tick loop, the full match lifecycle, pathfinding with collision, both draft modes, the day, night and weather system, and the wiring to the rest of the services. What is left is the in-match combat simulation and the 3D client, which is the part I am on now.
It is the biggest thing I have taken on and I am still in the middle of it. But it starts the same way everything else on this page does: something annoys me enough that I end up building my way out of it :')