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.
  • {{ fmtClock(c.start) }} in progress…

    {{ intervalById.has(c.id) ? fmtMin(intervalById.get(c.id)) + ' after previous' : 'first recorded' }}

    {{ c.end !== null ? fmtDur(c.end - c.start) : fmtDur(now - c.start) }}

    {{ c.note }}

Duration over time

Time between contractions

Intensity over time