MediaRecorder as a hook — start / pause / resume / stop, a live duration that excludes paused stretches, a container negotiated against what the browser really supports, permission and unsupported as first-class states, and every track stopped on unmount so the recording indicator goes out.
npx shadcn@latest add @zyeon/use-media-recorderZyeon UI limits how often it can be asked, and useMediaRecorder hasn't had its turn. Its source will show here once it has.