client-only frontend