Que bom que curtiu!
Cara, sem dúvida o maior desafio foi sincronizar interações do usuário no canvas com o restante do estado da aplicação.
Eu optei por utilizar uma lib famosa para trabalhar com grafos, o cytoscape.js. Com ele eu consigo criar essa visualização de rede, em que cada nó pode se conectar aos demais. Mas interações nessa rede precisam desencadear atualizações em outras partes da aplicação, então foram vários event listeners rodando pra sincronizar tudo.
O próximo grande desafio vai ser melhorar a colaboração em tempo real com múltiplos usuários. Provavelmente utilizando web sockets.