basic client-side functionality