About as minimal as an indeterminate indicator gets — it says little more than "still alive" — which makes it a good quiet signal for a live connection state (websocket connected, recording in progress). It's the wrong choice once progress can be measured; use progress-ring for that.
A single dot animates scale and opacity together on an ease-out-leaning keyframe, producing a "grow and fade" feel. Being a one-dot implementation, it takes far less code than the others here, and lining up several dots naturally turns it into ripple-loader.
For a long wait covering the whole screen, a skeleton usually feels faster; for anything under 200ms, skip it entirely to avoid a flash. Give the wrapper role="status" and aria-live="polite", and hide the dot itself with aria-hidden="true" since it's decorative. Under prefers-reduced-motion, shrink the scale range or fall back to a static dot.