client side: put spy in its own module