I wanted to play with WebSockets so I was thinking "what service can I write that will provide a nice project that uses the WebSockets". I love working with other developers and the whiteboard is the main tool we use for brainstorming, design sessions, etc. so I thought it would an interesting project to have a shared whiteboard that people can interact with from different devices. Of course this will not be a commercial level application but it would be fun and the end result should be interesting enough to play with.
A demo video of the final result
The Story
It started with a simple high level design, 3 main parts:
The web client front end - The user interface made of a Canvas HTML element for the drawing area, a select control for selecting different whiteboards and a color picker so it will not be too boring. I went with Vue because I am not really a front end developer and Vue was simple enough to have something up in a few minutes of reading.
The server - I thought it would fun to also learn Rust as part of this project but after implementing a basic Rust Http server I decided to focus on the project's functionality instead of wrestling with the Rust compiler. I find Rust very interesting and I plan to continue my Rust education in a different context. So I went back to my good old friend C#. Going with C# the obvious choice was to use ASP.NET Core and SignalR.
The persistent storage - The standard choice here was to pick a database engine and just store the stuff in that. I always wanted to test a "database" that worked like Git, so I implemented a simple storage engine that uses Git as the file manager. Ya ya I know, "don't reinvent the wheel" and all that, but what's the fun in that. I want each line stroke on the whiteboard to have it's own commit so the git log will reflect the sequence of lines as they are drawn on the whiteboard.
To be honest there was nothing special in this project except having fun writing it. You can review the code here:
GitEngineDB - There is also a NuGet package for this
I plan to create a Docker image for the server.
If you find the GitEngineDB interesting please feel free to share your thoughts on the project's GitHub page. Also pull requests are welcomed.
Overall it was a fun project, I know I need to work on my front end skills, as the saying goes "presentation is everything" but moving pixels around ain't my idea of fun, it is a necessary evil.