I made a game (https://polyfight.io/) which revolves around a player (a tank) leveling up and upgrading by killing shapes and other tanks (partially inspired by https://diep.io). It has a bunch of features, a vast number of tanks, an inbuilt chatting system, clans to make teams with your friends, a colour scheme maker, controllable sandboxes which can be public or private, a last man standing gamemode, and an inbuilt 1v1 system with its own ELO rankings and a global leaderboard. The game has a few players right now, and I'd hope to spread the joy players have with this game to people here, as well as any critiques people have about the game. Exploits/gray hat hacking is warmly welcomed, as I strive to make sure my game is secure and hard to script/bot in.
That said, this is still good work, especially considering your experience and age (I checked out your 2D physics library on github and I found the trailer on youtube).
One suggestion: As someone in the game industry, I personally wouldn't label it an MMO as it doesn't include many of the features, particularly the "massive" part of MMO, that is usually associated with that term. The work is already impressive enough, you don't need to give it a label that could open it to criticism.
Otherwise, this is solid work. If you're aiming for a career in the game industry eventually, it's a good foundation to build on.
I have ported Quake III to use DataChannel and it works great (once all the WebRTC boilerplate is in place). You can test it here: https://thelongestyard.link/ Once you click the multiplayer link you will get a URL with your server name, which others can visit to join your server instantly.
Back then Quake 3 would require 3d accelerators and now we can play it in the browser... and some person on HN just casually "ported it". Awesome!
What's the technology there? Do you run it on WASM?
Taking great care to design your data streams to be self-correcting (e.g. transfer a world location where characters are going towards instead of which direction they are heading) can go a long way towards saving a ton of synching headaches, and enables very efficient networking.
One-off events go over the TCP-like channel, but constant streaming data that naturally self-correct over time, like the example above, can benefit from being on the UDP channel.
That's also how some speed hacks are made possible.
Dead Comment
I'm currently enjoying more relaxed MMO settings using threeJS libraries with multiplayer built in:
https://summer-afternoon.vlucendo.com/
https://developer.valvesoftware.com/wiki/Prediction
Also on Firefox the FPS meter says 40 FPS, but visually the game (the interface rather, I was unable to play) is clearly not smooth, clearly below stable 24 FPS.
I did encounter a bug where out of nowhere I was jolted onto the bounds of the map (specifically the lower-left corner) and died, killed by "Unknown".
I think thse bugs in this kind of game are especially scary because you lose everything when you die, which makes you a little weary of starting again. You might get far just to randomly die for no reason. If those are ironed out, I think you've got yourself a pretty good .io game to build upon and keep evolving here!