useCan
Gate UI on the same scope strings the server enforces — reactive permissions.
Gate UI on the SAME scope strings the server's requireScope checks — one
source of truth, no separate frontend permission list. Feed the subject's scopes
(from your session query) to <PermissionProvider>; useCan reads them.
import { PermissionProvider, useCan } from '@voltro/client'
<PermissionProvider scopes={session.scopes}>…</PermissionProvider>
const canDelete = useCan('todos:delete') // ADMIN bypasses; deny-by-default
UX only — the server still enforces. Pairs with <AutoForm> / <DataTable> to
auto-hide actions the subject can't perform.
The scope set itself, the canCall matcher, the OR variant (useCanAny /
canCallAny), and the per-RESOURCE gates (useResourceCan / useResourceCans)
are in usePermissions.