Some technical details: The backend runs on Google App Engine. The server keeps a concept of the 'freshest' canvas. I have a cron job that aggregates all pixel changes and creates a fresh canvas. When you download the app, you initially download the fresh canvas. After that, you only download a very small amount of JSON which represents the pixel changes.