Chronometer

A precise online stopwatch with lap and split times, keyboard shortcuts and a copyable results list. Uses a monotonic clock so a throttled background tab cannot make it drift.

A stopwatch that does not drift. Start, pause and record laps with the buttons or the keyboard. Each lap keeps both its own split and the running total, and the whole list can be copied out in one go.

00:00:00.00

Space starts and pauses, L records a lap, R resets.

Laps
# Split Total

No laps recorded yet.

What makes a browser stopwatch accurate

Timestamps beat counters

The naive way to build a stopwatch is to add a fixed amount to a counter on every tick. It is also the wrong way, because timers in a browser are not guaranteed to fire on schedule. Switch to another tab and the interval is throttled to once a second or paused entirely; put the laptop to sleep and it stops altogether. A counter built that way loses time and never gets it back.

This chronometer instead records the moment it started and subtracts that from the current moment on every repaint. Nothing accumulates, so nothing can accumulate error. If the tab is throttled, the display stops updating but the underlying clock keeps running, and the first frame after you come back shows the correct elapsed time rather than a number that fell behind while you were away.

Monotonic time, not wall-clock time

The clock used here is performance.now(), which counts from when the page loaded and only ever moves forward. That matters because wall-clock time - what Date.now() reports - can jump. NTP corrections nudge it, daylight saving transitions shift it, and a user changing the system clock can move it by hours in either direction.

A stopwatch reading from wall-clock time inherits every one of those jumps. If an NTP sync happens to land mid-measurement, your recorded interval is simply wrong, and nothing in the interface would indicate it. A monotonic source has no such failure mode: it is not synchronised to anything, it cannot be adjusted, and the only thing it measures is elapsed time.

Split versus total, and why both are shown

Each row records two numbers. The total is the time from the start to that lap, and the split is the time since the previous lap. They answer different questions and it is worth being clear about which one you are reading.

When timing a runner over eight laps, the split tells you whether they are holding pace, fading or kicking - it is the per-lap performance. The total tells you where they stand against a target time for the whole distance. Looking at only the total makes a slowdown hard to spot, because each figure includes everything before it; looking at only the splits loses track of the overall result. Showing both means you can read pace and progress from the same table, and the copyable export keeps both columns for whatever you paste it into.

Runs entirely in your browser with plain JavaScript - no libraries, no uploads, no tracking.

Frequently asked questions

How precise is the timer?
The display shows hundredths of a second and the underlying clock is sub-millisecond. In practice the limit is your reaction time on the button, not the timer.
Does it keep running if I switch tabs?
Yes. The visual update pauses because browsers throttle background tabs, but the elapsed time is calculated from timestamps, so when you return the display immediately shows the correct value.
What is the difference between split and total?
Total is measured from the start of the run to that lap. Split is measured from the previous lap. Splits show pace; totals show progress against the whole.
Are my laps saved if I reload?
No. Everything lives in memory only, so a reload clears it. Copy the lap list before you leave the page if you need to keep it.
What are the keyboard shortcuts?
Space starts and pauses, L records a lap, and R resets. They are ignored while you are typing in a field, so they will not fire unexpectedly.
Can I record a lap while paused?
No, the button is disabled. A lap marks a moment in a running measurement, so recording one while the clock is stopped would just duplicate the current total.