server-side processing is optional