all client side with async background saving WIP