Wonderful job!
edit: I'm curious, how did you code for the dithering?
The shader uses a 4x4 Bayer matrix for dithering:
The code is open and available for review, so you can check out the implementation directly. You can read more about dithering and the Bayer matrix here: https://en.wikipedia.org/wiki/Ordered_dithering