Stopwatch
A precision stopwatch with millisecond-accurate display driven by requestAnimationFrame and performance.now() — no choppy setInterval updates. Record unlimited lap splits, see your best and slowest laps highlighted automatically, and keep going across page refreshes thanks to localStorage persistence. Runs entirely in your browser.
How to use
- 1
Start the timer
Click Start. The display updates on every animation frame for smooth millisecond motion — about 60 times per second on most displays.
- 2
Record laps
While running, click Lap to capture a split. Each lap shows the time since the previous lap (split) and the total elapsed time at that lap. The list auto-scrolls to the newest entry.
- 3
Pause, resume, reset
Click Pause to freeze the clock, then Resume to continue. Reset clears the timer and all laps. Laps can also be cleared on their own without resetting the clock.
- 4
Best / slowest lap
Once you have two or more laps, the fastest lap is highlighted in green and the slowest in red so you can spot trends at a glance.
Common use cases
- Time running intervals, swim splits or track laps with millisecond precision.
- Measure task durations for time-tracking or productivity experiments.
- Run a debate or speech timer where you record per-segment splits.
- Demo a “click reaction time” benchmark with start + lap on a single click.
Limitations
- The display refreshes once per animation frame, so on a 60 Hz monitor the millisecond digit advances in ~16 ms steps; on a 120 Hz display it updates in ~8 ms steps. The underlying timing uses
performance.now(), which has microsecond resolution — only the rendering is frame-locked. - When the tab is in the background, most browsers throttle requestAnimationFrame to a much lower rate (or pause it entirely). The accumulated time stays accurate because we recompute from the baseline + delta on every render, but the visible millisecond digit will not animate while the tab is hidden.
- Persistence uses localStorage, which is per-browser and per-device. Clearing site data will erase a running stopwatch.
- If the system clock is changed while the stopwatch is running and the page is open, accuracy is unaffected — we use the monotonic
performance.now()timer for live deltas. A clock change while the tab is closed, however, will affect the resume calculation.