implement client-side runner