client-side impls