Very impressive! Well done.
This might be too sensitive for a public answer; but, I was wondering why you chose Colyseus above all other possible solutions.
It’s actually my first multiplayer game. I did it to gain experience in multiplayer development. I considered doing it directly using node and websockets but colyseus seemed simple enough. I code my games in TypeScript and colyseus works with TS. The state synchronization that colyseus offers is quite handy. No need to send messages all the time because the framework informs all clients when the state of the room has changed. Basically the client needs to check the changes on the state and act accordingly.
Which other options would you have tried for a game like this?