generation is now fully done on the client side