Date & time Works offline

Stopwatch

A millisecond stopwatch with lap and split timing, fastest and slowest lap markers, keyboard shortcuts and a one-click CSV export of every lap.

Elapsed time

00:00.000

Stopped at 00:00.000 (0.00 s). Press Start to begin.

Keyboard shortcuts

  • Space start or stop
  • L record a lap
  • R reset

Shortcuts are ignored while the focus is inside a text field. While a button has focus, use the button's own key — Enter — so a single press does not count twice.

Laps

Laps recorded

0

Fastest lap

—

Slowest lap

—

Lap times with split totals and markers for the fastest and slowest lap
Lap Lap time Split (total) Marker
No laps yet. Press Lap while the stopwatch runs, or use the L key.

Lap time is the duration of that lap alone; split is the total from the start. The fastest and slowest laps are marked as soon as two laps exist.

Elapsed time is computed from a stored start timestamp on every frame, so laps stay accurate even when the tab is throttled in the background. Laps live in memory only — export them before you close the page.

How the stopwatch works

Everything begins with a timestamp. When you press Start, the page reads a monotonic high-resolution clock and remembers that instant as the run's origin. Every animation frame it reads the clock again, subtracts the origin, subtracts any time that had already been banked from previous runs, and writes the result into the readout. Nothing is ever incremented, so a slow frame, a throttled background tab or a sleeping laptop cannot make the total drift — the stopwatch simply reports the difference between two clock readings whenever it is asked.

Lap and split times come from the same idea. Pressing Lap records the current total as a new split. The lap time shown next to it is that split minus the previous one, and the final lap is always the latest split minus the previous split. Because both figures are derived from stored timestamps rather than from arithmetic done at press time, the table stays internally consistent: the splits always add up to the total on the readout.

Control Action When it is available
Start Begins timing, or resumes from a stop Whenever the stopwatch is not already running
Stop Freezes the total and keeps every lap Only while running
Lap Appends a split and works out that lap's duration Only while running
Reset Returns the readout to zero and clears the table Whenever time has been recorded
Export Writes every lap to a CSV file on your device When at least one lap exists

Stop is a real pause, not a reset: the total freezes, the laps stay in the table, and pressing Start again continues from the frozen total as though no time had passed in between. That makes the tool usable for anything that gets interrupted — a set of stretches, a queue of tasks or an interval workout — without losing the earlier laps.

Accuracy and honest limits

The clock source is the browser's high-resolution monotonic timer, which is deliberately independent of the system date, so changing the computer's clock or crossing a daylight-saving boundary cannot corrupt a measurement. What limits the numbers you actually see is painting, not measuring.

  • Display resolution follows the frame rate. The millisecond field updates each time the browser paints, roughly every 16 ms on a 60 Hz screen. The underlying elapsed value is finer than that, but no on-screen digit can update faster than the screen does, so treat the last digit as indicative rather than authoritative.
  • Hidden tabs may not repaint. The stopwatch keeps correct time in a background tab, but the digits can appear frozen when you return for a fraction of a second before the next frame catches up. If you need to read the numbers continuously, keep the tab visible.
  • Laps are manual. A lap is recorded at the moment you press the button, so your own reaction time — typically a couple of tenths of a second for a mouse or keyboard press — is part of the measurement. For anything where precision matters, press and hold nothing extra: one clean press per lap gives the most repeatable result.

Laps exist only in this page's memory. Refreshing, navigating away or closing the tab clears them with no warning, so use Export laps as CSV before you leave if the results matter.

How to use it

  1. Start timing. Press Start or the Space key. The readout shows minutes, seconds and milliseconds, and grows an hours segment automatically once the run passes an hour.
  2. Record laps. Press Lap or L at each marker. A row appears with the lap number, that lap's own duration and the running split total.
  3. Read the markers. As soon as two laps exist, the fastest is badged green and the slowest red, both in the table and in the summary tiles above it. Ties are left unmarked rather than picked arbitrarily.
  4. Stop and resume. Press Stop or Space to freeze the total; pressing Start again continues from the same total, so an interruption costs nothing.
  5. Reset for a clean run. Press Reset or R to zero the readout and empty the laps table — export first if you want to keep them.
  6. Export. Export laps as CSV builds a file named for the date with columns for lap, lap time, split and marker, and downloads it straight to your device.

Every shortcut is suppressed while the focus sits in a text field, so typing a note in another part of the page can never trigger a lap or a reset by accident. All timing happens locally: no data is sent anywhere, no account is needed, and the page works with the network switched off.

Frequently asked questions

How precise is the stopwatch, and how is it measured?

Elapsed time is measured with performance.now(), a monotonic high-resolution timer that returns a fractional millisecond count since the page loaded. Instead of adding a small amount on every tick, the stopwatch stores the timestamp at which the run began and subtracts it from the current reading on every animation frame, so nothing is lost when frames are dropped. In a visible tab that means the reading is limited mainly by your display's refresh rate — about 16 ms per frame at 60 Hz — and the last three displayed digits only change at the pace the browser paints. It is excellent for laps, intervals and reaction work; it is not a laboratory instrument, and it cannot resolve differences smaller than your screen's frame interval.

What is the difference between lap time and split time?

Split time is the total elapsed time from the start of the run to the end of that lap; lap time is only the duration of that lap — the difference between the previous split and the current one. If you record a lap at 1:30 and then the next at 2:00, the first row shows a lap of 1:30 on a split of 1:30, and the second shows a lap of 0:30 on a split of 2:00. Splits are always increasing, so the table can tell you at a glance when you slowed down even if the laps themselves look similar.

Does the stopwatch keep running if I switch tabs or lock the screen?

Yes, and the elapsed time stays honest. Because the start timestamp is fixed and the difference is recomputed rather than accumulated, a throttled or paused tab cannot make the stopwatch fall behind — when you return, the display jumps straight to the correct total. Two things do change in the background: the digits may stop updating while the tab is hidden, since the browser may stop painting animation frames, and lap recording has to be done by you, so laps are only captured when you actually press the button. The reading in a hidden tab is still correct whenever it is next drawn.

Can I save or share the lap times?

Use the export button, which builds a CSV file in the browser and downloads it. The file has one row per lap with columns for the lap number, the lap time, the split time and a marker for the fastest and slowest lap, and it opens directly in a spreadsheet. Nothing is sent anywhere: the text is assembled from the table in memory, wrapped in a Blob, handed to the download as a temporary object URL and then that URL is revoked. Reloading or closing the page clears all laps, so export before you leave.

Sources & further reading

  • MDN Web Docs — performance.now() — The monotonic, sub-millisecond timer the stopwatch reads for start, stop and lap timestamps — immune to system clock changes, unlike Date.now().
  • MDN Web Docs — Page Visibility API — Explains how hidden tabs are throttled and how visibilitychange fires; the reason this stopwatch recomputes elapsed time from a stored timestamp instead of counting ticks.
  • MDN Web Docs — Web Audio API — Background for browser audio in general; this page needs no sound at all, and the companion countdown timer uses the same API family for its optional beep.