A stopwatch that measures elapsed time in hours, minutes, seconds, and centiseconds. Tap Start, tap Stop to pause, tap Reset to clear everything. The Lap button records a split without stopping the timer.
Everything runs in your browser — there’s no server. The timer reads the wall clock via performance.now(), which typically delivers millisecond or sub-millisecond accuracy on modern hardware. The display rounds to the nearest centisecond (10 ms) because anything finer flickers too fast to read.
How the state works
The stopwatch has three distinct states: idle (at 0, no laps), running (accumulating time from the start point), and paused (has elapsed but not running). Each button transition is independent:
- Start from idle or paused → running
- Stop from running → paused (elapsed accumulates)
- Start again from paused → running (resumes from accumulated elapsed, not from zero)
- Lap → records current elapsed, timer continues if running
- Reset → back to idle, clearing elapsed and laps
The start/stop/start/stop sequence accumulates time correctly across multiple runs. If you start, run 30 seconds, stop, wait an hour, then start again and run another 45 seconds, the display shows 1 minute 15 seconds — not 1 hour and some.
Example: interval training
Running 8 × 400m intervals with 60-second rests. Start the stopwatch before the first rep, tap Lap as you finish each 400m, and tap Lap again when you start the next rep. The split column shows your rep times interleaved with rest durations; the total shows cumulative elapsed from the workout start.
After the session, the lap list is a complete record of the workout with all 16 splits (8 work + 8 rest). Copy it to your notes before closing the tab — the tool doesn’t persist anything.
Example: cooking with stages
Making bread: mix (5 min), bulk ferment (60 min), shape (2 min), proof (45 min), bake (30 min). Start the stopwatch when you begin mixing, and tap Lap at each stage transition. You get a record of how long each stage actually took versus the plan, which is useful for recipe notes and for predicting timing on the next bake.
Example: chess or game turn limits
Informal blitz chess with a 5-minute-per-side rule: start the clock when your opponent plays their move, tap Stop when you play yours. Reset between games. The centisecond display makes it easy to see exactly how much time each move took, which is useful for post-game review of time usage even in casual play.
Precision and limits
Timer precision is limited by the browser’s performance.now() implementation — typically 0.1 to 1 ms in modern browsers, enough for 10 ms display to be meaningful. The display tick rate is 50 ms (20 Hz), which is the human-perceptible limit for smooth numeric display and is deliberately slower than the precision of the underlying clock. You won’t see every millisecond increment, but the final lap times are stored to millisecond precision internally.
For accuracy better than about 10 ms, a browser-based tool isn’t the right fit. Use a dedicated hardware timer, a phone app with a native timer, or a specialized lab instrument. Browser JS timing can be affected by tab throttling (background tabs run at reduced rates), GC pauses, and other system load.
What this tool does not do
It doesn’t count down — this is a stopwatch, not a countdown timer. For countdowns (cooking timer, pomodoro, yoga savasana), use the pomodoro timer or the interval timer.
It doesn’t save or sync across devices. Everything lives in the browser tab. Close the tab and the data is gone.
It doesn’t handle multiple timers simultaneously. If you need to time two things at once, open the tool in two browser tabs.