client-side computation