Stopwatch (millisecond precision, lap times)
Browser-based stopwatch using performance.now() for jitter-free timing. Start, pause, resume, capture laps, and reset. Each lap shows split (delta from previous) plus cumulative time.
How it works
Why this stopwatch is accurate
Most browser stopwatches use Date.now() and setInterval, which can drift by tens of milliseconds during a session. This implementation uses performance.now() — a monotonic clock that doesn't jump backward when the system clock is adjusted. Combined with requestAnimationFrame for display updates, accuracy stays within ±1 ms.
If you switch tabs, the displayed time may freeze briefly because browsers throttle background work. The internal clock keeps running correctly — when you switch back, the display catches up to the actual elapsed time.
Lap times and split times
When you press Lap, the current cumulative time is recorded. The displayed split is the delta from the previous lap: in a 5×400m run, each split is one 400m segment time, while the cumulative is total elapsed since start.
Most lap-list users care about splits, not cumulative. We show both. Cumulative also makes it easy to identify the best individual segment — useful for athletes tracking interval consistency.
Common uses
Sports: track lap times for running, swimming, cycling intervals. Smaller is better; consistency between splits is a sign of good pacing.
Cooking: time multiple steps simultaneously by using laps as 'check points' (mix added, dough resting started, etc.).
Study/work: timeboxing focused work sessions. Pair with our Pomodoro timer for structured breaks.
Process timing: measure duration of any task — software builds, manual data entry, customer support resolution. Use the export-friendly lap list for later review.
Frequently asked questions
›Will the timer keep running if I close the tab?
No — closing the tab clears the in-memory state. To preserve a long timing session, take a screenshot of the running display or copy the lap list before closing.
›How accurate is millisecond precision in practice?
performance.now() resolution is browser-dependent: most browsers limit to 1ms or 0.1ms for security reasons (timing attack mitigation). This is plenty for human-scale timing — far more accurate than human reaction time (~250ms).
›Why does the display update at 60fps but show milliseconds?
The internal clock is precise; the display is rendered ~60 times per second so you see a smoothly updating millisecond field. Each frame computes the latest elapsed value from performance.now().
›Can I save a lap session?
Not directly — copy the lap list manually. Saving sessions to local storage is on the roadmap.
›What's the difference between this and a phone stopwatch?
Browser-based, no app install needed. Equally accurate for human-scale timing. Phone stopwatch survives screen lock; browser tab needs to stay open (but doesn't need focus).
›Is the data sent anywhere?
No. Everything runs locally; no laps or times are transmitted.
›Why does my lap show 0 milliseconds?
If you tap Lap immediately after Start, the elapsed time may round to 0 with display precision. Run for at least a fraction of a second between laps.
›Can this measure sub-second events?
Yes, down to ~1ms. For nanosecond timing (chip benchmarking) you'd need different tooling, but for any human-observable event this is precise enough.
Related tools
Last updated: