Nice implementation. Out of curiosity, how are you handling multiplayer state sync?
For a board game like this I’d imagine sending move events and letting clients recompute the board locally rather than syncing the whole board every turn. Curious what approach you took.