Online Stopwatch
Start, lap, split, stop. Every lap is recorded with its own duration next to the running total — the distinction that makes a lap list worth keeping. Nothing is uploaded, and the timing runs against your device's clock rather than a count of screen refreshes.
Stopwatch
Records a split without stopping the clock.
Keyboard shortcuts
- Space
- Start or stop
- L
- Record a lap
- R
- Reset
Shortcuts work while focus is anywhere on this tool and not in a text field, so they never interfere with typing or with a screen reader's own single-key navigation.
Laps
Laps you record will appear here.
Show as plain text
Stopwatch — 00:00.00 total Lap Lap time Total
Saved in this browser only. Clearing site data or switching devices will erase it.
How this stopwatch works
Almost every stopwatch you will find on the web counts screen refreshes or timer callbacks and adds them up. That works while you are watching it and breaks the moment you are not. Browsers deliberately slow background tabs down: Chrome checks timers about once a second in a hidden tab, and drops to once a minute once the tab has been hidden for five minutes. Firefox for Android clamps to a fifteen-minute minimum and may unload the page entirely. An implementation that adds up ticks loses exactly as much time as the browser withheld.
This one never adds anything up. When you press Start it records a single instant — the reading on your device's clock at that moment — and every frame after that it subtracts: elapsed = now − started + time already banked. There is no counter to fall behind. Background the tab for ten minutes and the first frame after you return already shows the right number, because the number was never being accumulated in the first place. It is recomputed from scratch, sixty times a second, from two timestamps.
Why the clock and not the high-resolution timer
Browsers expose two clocks. Date.now() reads the wall clock — the same time your operating system shows. performance.now() is monotonic: it never jumps backwards, which sounds like exactly what a stopwatch wants. We use the wall clock anyway, for two reasons that only show up in the cases people actually hit.
The first is sleep. The specification says the monotonic timer should keep advancing while the operating system sleeps, and in practice only browsers on Windows do. Close a laptop lid on macOS or Linux with a monotonic stopwatch running, open it three hours later, and almost no time has passed as far as that stopwatch is concerned. The wall clock does not have this problem, because three hours genuinely elapsed. The second is reloading: the monotonic timer is measured from the moment the current page was created, so a value saved before a reload refers to an origin that no longer exists. Nothing of that kind is ever written to storage here — only the wall-clock instant and the time already banked, which mean the same thing tomorrow as they do now.
The honest cost of that choice: if your device corrects its clock while the stopwatch is running — an automatic time sync, or you change it by hand — the elapsed time moves with it. We take that trade because a clock correction is rare and usually small, while a closed laptop lid is neither.
Laps and splits
Each lap stores the total elapsed time at the moment you pressed the button. The lapduration shown next to it is calculated as the difference between that reading and the one before it, every time the table is drawn. Nothing is accumulated, so a rounding error cannot creep down a long list, and the lap durations always add up to the total exactly.
What "to the hundredth" actually means
The display shows two decimal places and no more, and that is a deliberate limit rather than a shortcut. Browsers reduce the resolution of their high-resolution timer on purpose — it is clamped to 100 microseconds outside a specially isolated page — as a defence against timing attacks. The readout also repaints on the display's refresh cycle, so on a 60 Hz screen a third decimal place would be showing you a digit that changed between two frames you never saw. Printing milliseconds would imply a precision the platform does not offer.
Worked example: the ten-minute background tab
Start the stopwatch, note the reading, and switch to another tab for ten minutes. Come back. The reading has advanced by ten minutes and the hundredths are moving again immediately. What happened underneath: the browser paused the animation frames entirely — that is the documented behaviour for a hidden tab, not throttling but a full stop — so nothing repainted for ten minutes. On return, the first frame subtracted the start instant from the current clock reading and printed the answer. The pause cost you smoothness for ten minutes and accuracy of nothing.
Worked example: laps that add up
Three laps at 31.20 s, 61.08 s and 134.62 s produce lap durations of 31.20 s, 29.88 s and 73.54 s. Those three add to 134.62 s — the total, exactly. Copy the table out and the same numbers appear in the text block, because both are rendered from the same three stored readings.
Limitations, stated plainly
- It is not a certified timing device. It is as accurate as your device's clock and your reaction time, and the second of those dominates by a wide margin.
- A clock change moves the elapsed time. See the trade explained above.
- The readout widens once, at one hour. Below an hour it reads
MM:SS.CC; at one hour an hours figure appears and the display gets one character wider. It is the only time the layout moves. - Laps are capped at 500. Past that the stopwatch keeps timing but stops recording laps rather than discarding your earliest ones — deleting lap 1 would renumber every lap after it and leave the new first lap's duration measured against a reading that no longer exists.
- Individual laps cannot be deleted in this version, for the same reason. Reset clears the session, and offers an undo.
- Saved in this browser only. Clearing site data or switching devices will erase it.
Sources
- Chrome: timer throttling in background tabs — the once-a-second and once-a-minute figures quoted above.
- MDN: setTimeout — Firefox desktop and Firefox for Android clamping.
- MDN: performance.now() — resolution clamping, and the note that only browsers on Windows keep ticking during sleep.
- MDN: performance.timeOrigin — why a monotonic reading cannot survive a reload.
- MDN: requestAnimationFrame — paused, not throttled, in background tabs.
Questions
Does it keep running if I switch tabs or lock my phone?
Yes. The display stops repainting, because browsers pause animation frames in a hidden tab, but no time is lost — the elapsed figure is worked out from your device's clock the moment you come back, not from how many frames were drawn while you were away.
Will it survive a reload?
Yes. A running stopwatch keeps running across a refresh, a closed tab, or a restarted browser, and your laps come back with it. The state is saved in this browser only — there is no account and nothing is uploaded, so it will not follow you to another device, and clearing your site data will erase it.
What is the difference between a lap and a split?
In the table, Lap time is how long that individual lap took, and Total is the elapsed time when you pressed the button. Runners usually want the first; timing a whole sequence usually wants the second. Both are shown for every lap, so you never have to do the subtraction yourself.
How accurate is it really?
Accurate to the hundredth of a second against your device's clock, which is far finer than the roughly two tenths of a second a person takes to press a button in response to something. For hand timing, your reaction is the limiting factor, not the stopwatch. For anything where the result matters — an official race, a laboratory measurement — use equipment built for it.
Can I use the keyboard?
Yes. Space starts and stops, L records a lap and R resets, as long as focus is somewhere on the tool and not inside a text field. Every control is also an ordinary button you can reach with Tab.
Does it work with a screen reader?
The ticking figure is deliberately silent — a readout that announced itself sixty times a second, or even once a second, would be unusable. Instead the elapsed time is available on demand from the Announce elapsed time button, each lap is announced once as it is recorded, and starting, stopping and resetting are announced as they happen. The lap table is a real table with row and column headers, and the same data is available as plain text.
Why can I not delete a single lap?
Because it would quietly corrupt the rest. Lap durations are worked out as the gap between consecutive readings, so removing one in the middle would merge two laps into one and renumber everything after it, with no visible sign that it had happened. Reset clears the whole session and offers an undo, which is honest about what it is doing.