@philip45, I kind of like the constraint of only adding one cell per step. Also, as it currently is, you can only add black cells, so adding too many at once would make it harder for your color to survive (which is supposedly the goal :) ).
I'm sorry about zooming - if you scroll up and wait a minute, it usually catches up with rendering, but there are 2 things I should have changed to stop it freezing in the first place - firstly, I did put a limit on zoom level, just didn't make it strict enough (you can zoom out to 1 pixel per cell). Secondly, I redraw the whole thing on each event that could change things. This works great when changes happen less often than rendering takes (if you're not doing anything, it's once per second), but it's a problem when scrolling rapidly and rendering takes ages due to the scale. I've realized that I should have been running something about 1000 times a second that checks a boolean and redraws if it needs to. If rendering was taking too long, this would just automatically run less frequently, allowing multiple changes to happen between redraws.
There's also the possibility of speeding up rendering - right now, I just make lots of calls to the canvas API's fillrect method, but since the grid is a 256x256 torus, I could just draw that once and then copy it across the canvas. I thought about that during the jam, decided it would take too long for a minor gain. (I should have applied the same reasoning when I decided to implement base64 encoding myself, but hey).