A 25-minute focus block, a 90-second egg, a 47-minute presentation slot with a hard stop. Set the hours, minutes and seconds you need, then press Start. The timer runs entirely in your browser, counting down from your set time to zero, and it works on any device with a screen. No account, no download, no setup beyond the one click.

Setting hours, minutes and seconds

Three fields, then a Start button. Click a field and type the number you need. The timer accepts any value up to 99 hours. Press Tab to move between fields, and Enter to start.

You do not need to set all three. A 25-minute Pomodoro session is just minutes. Leave the unused fields at zero.

How the timer tracks elapsed time

The countdown uses performance.now(), the browser's monotonic clock. It measures real elapsed time, not wall-clock time. That distinction matters.

Date.now() (wall-clock time) can jump forward or backward. NTP corrections, manual clock changes, daylight saving transitions: all of them can shift the value between one tick and the next. A countdown built on Date.now() would skip seconds or add them silently.

performance.now() only ever increases. It is unaffected by system clock adjustments and resets only on page navigation. The timer asks "how much time has actually passed since Start?" rather than "what does the clock on the wall say right now?" For a countdown, that is the question that counts.

Why the numbers stay correct when you switch tabs

Browsers throttle timers in background tabs. Chrome began aggressive throttling around 2017, dropping setInterval to one fire per second in hidden tabs. requestAnimationFrame pauses entirely. This is by design, for battery conservation.

The countdown does not rely on a ticking interval. When you return to the tab, it recalculates the remaining time from the monotonic clock and updates the numbers immediately. The visuals may pause while you are away, but the value is correct the moment you return.

Alerts and what happens at zero

When the countdown reaches zero, the timer fires an audible alert. The sound plays through the browser's audio context and requires a user gesture to start the timer in the first place: that initial click on Start satisfies the browser's autoplay policy.

The alert fires even if the tab is hidden, provided the page is still open. If the device is asleep or the browser is closed, the alert cannot fire. The timer runs locally; it does not use a server-side trigger.

Keeping the screen on during a countdown

The Screen Wake Lock API, introduced as a W3C specification around 2017 and widely supported in Chromium browsers by 2020, can prevent the screen from dimming or locking while the timer is visible. It is separate from the Fullscreen API. Fullscreen mode only controls window presentation; it does not keep the screen awake.

Wake lock behaviour: it releases when the tab is hidden or the device locks. It cannot override OS-level power settings on all platforms. On OLED screens, static elements carry a burn-in risk. The timer shifts pixel positions slightly to reduce that risk, but for multi-hour sessions on OLED hardware, check the manufacturer's guidance on static content.

Fullscreen for classrooms, lobbies and exam halls

The Fullscreen API, standardised between 2012 and 2014, expands the timer to fill the screen. It requires a user gesture: a click or keypress. A page cannot force fullscreen on load.

Use cases where a fullscreen countdown earns its keep:

  • Exam halls. One large screen, visible to every student. No interaction required during the countdown.
  • Lobby and signage screens. Often run in kiosk mode on a Raspberry Pi. The timer needs to survive power cycles and run unattended.
  • Stream starting-soon screens. OBS Studio browser source overlay. The countdown sits in a stream layout, readable at low bitrates.
  • Clinical settings. Timing procedures or medication intervals on a wall-mounted screen with no screensaver interruption.

What the timer cannot do

The browser gets its time from the operating system. If the OS clock is wrong, Date.now() is wrong. The monotonic clock sidesteps that for elapsed measurement, but the timer does not verify system time against an external source. No browser API exposes NTP status, stratum level, or last sync time to JavaScript.

The numbers on screen are not the accuracy. Rendering pipeline latency typically adds 16 to 50 milliseconds depending on frame timing. The readout is for casual reference, not calibrated measurement.

Saving preferences and what private browsing means

Timer settings (preset durations, alert volume, visual options) save to Local Storage. That is a synchronous browser API with roughly 5 to 10 MB per origin. Data persists indefinitely unless manually cleared.

In private or incognito modes, Local Storage is typically cleared when the session ends. Preferences set during a private session will not survive a browser restart.