Contraction Timer
{{ active ? 'Breathe — tap again when it eases off' : 'Tap when a contraction begins' }}
Past hour
rolling window{{ lastHour.length }}
contractions
{{ medianDuration !== null ? fmtDur(medianDuration) : '–' }}
median length
{{ medianInterval !== null ? fmtMin(medianInterval) : '–' }}
median apart
Medians shown — averages can make contractions seem closer together than they really are.
Changing over time
{{ !progression.ready ? 'Needs history' : progression.met ? 'Progressing' : 'Not yet' }}
longer {{ progression.longer ? '✓' : '' }}
stronger {{ progression.stronger ? '✓' : '' }}
closer {{ progression.closer ? '✓' : '' }}
{{ rule.name }}
{{ rule.met ? 'Pattern met' : 'Not yet' }}
≤{{ rule.freq }}m apart {{ rule.frequency ? '✓' : '' }}
≥1m long {{ rule.duration ? '✓' : '' }}
1hr {{ rule.sustained ? '✓' : '' }}
Timeline
Contractions you time will appear here.
-
{{ c.end !== null ? fmtDur(c.end - c.start) : fmtDur(now - c.start) }}{{ fmtClock(c.start) }} in progress…
{{ intervalById.has(c.id) ? fmtMin(intervalById.get(c.id)) + ' after previous' : 'first recorded' }}
{{ c.note }}