That part wasn't super straightforward, but the way it basically works is that the program sets a time value on the shader, then copies the image output of that shader to somewhere else, and then advances the time value every frame until a full rotation is done.
As you noticed I used another project to save all of those separate frames to a gif, and I have a custom implementation for just stacking all those images together in a spritesheet. But I didn't really use any resources to come up with that, it just seemed like the easiest way to do it.
Hope that makes sense!