Pomodoro Timer
Twenty-five minutes of focus, five minutes off, repeated — with the part most timers skip: a record of what you actually did. Sessions, daily totals and your current streak are kept in your browser, so the timer is worth coming back to rather than restarting from zero. The intervals are adjustable if 25/5 is not your rhythm.
Pomodoro timer
Your record
- Streak
- 0 days
- Today
- 0m no focus time
- Last 7 days
- 0m no focus time
Recent sessions
Your finished sessions will appear here.
Browsers slow timers down in background tabs. If this tab is not visible the end-of-session sound can be up to a minute late on desktop, and longer on Android — the countdown itself stays exact, and when you come back the page says when the session actually ended. Press Start or Test sound once to allow sound.
Saved in this browser only. Clearing site data or switching devices will erase it.
Keyboard shortcuts
- Space
- Start or pause
- R
- Reset this session
- S
- Skip to the next phase
Shortcuts work while focus is anywhere on this tool and not in a number field, so they never interfere with typing or with a screen reader's own single-key navigation.
How this pomodoro timer works
The technique is Francesco Cirillo's, and it is deliberately simple: work in one unbroken stretch, stop when the timer says so, take a short break, and take a longer one after every fourth stretch. Cirillo used a kitchen timer shaped like a tomato — pomodoro — and the timer mattered because it was a commitment you had made before you started, rather than a judgement you were making while tired. Twenty-five and five are the conventional numbers, not magic ones; the fields on this page are editable because the right interval is the one you will actually finish.
What this page adds is the record. A timer that forgets everything the moment you close the tab makes each session an isolated event, and the one thing the technique needs from a tool is the opposite: something that accumulates. Every completed focus session is written to your browser's local storage with the instant it started, the instant it ended, how long it was meant to be, and whether it ran to completion. Nothing is uploaded, and there is no account.
The countdown is anchored to your clock, not to a count of ticks
When you press Start, the page stores one number: the instant this phase should end, on your device's clock. Everything on screen is worked out by subtracting the current time from that instant. There is no counter being decremented, which matters because browsers deliberately slow background tabs down — Chrome checks timers about once a second in a hidden tab and drops to once a minute after five minutes; Firefox for Android clamps to a fifteen-minute minimum and may unload the page entirely. A timer built by subtracting a second per tick loses exactly as much time as the browser withheld, silently. This one loses nothing, because there is no accumulator to fall behind.
The same design is what lets a session survive being closed. Reopen the page after the deadline has passed and it works out that the session finished, records it with the time itactually ended, and tells you how long ago that was.
What counts as a completed session
A session is completed when it reaches its planned length without being reset and without having its length changed. Pausing does not break it — stepping away for two minutes is part of working, and a tool that punished it would be teaching the wrong thing. PressingSkip does break it: the session is still recorded, marked as skipped, because knowing you abandoned four sessions this week is more useful than pretending they never happened. Only completed focus sessions count toward your streak and your daily totals; breaks are recorded but never counted as work.
Daily totals count the planned length of each completed session rather than the wall-clock time between starting and finishing. If you paused a twenty-five minute session for an hour, that hour was not focus, and counting it would produce a number you could check against your own memory and find inflated.
Why a “day” is harder than it looks — and the accuracy point
A streak is a count of consecutive days, so everything depends on which day a session belongs to. The obvious implementation asks the browser for the date in UTC, and it is wrong for almost everyone: if you are in Los Angeles and finish a session at 5 pm, UTC has already rolled over to tomorrow. Your streak would credit the wrong day, and the day you actually worked would look empty.
So a day here is a calendar date in a named time zone — yours, detected from your device, or whichever you have set as your home zone. That distinction has a second consequence which is the one worth stating: on the night the clocks change, a local day is twenty-three or twenty-five hours long. A session finishing at 23:30 on the night the clocks go back belongs to that local day even though it is more than twenty-four hours after the previous midnight, and a streak counted by dividing timestamps by 86,400,000 gets it wrong twice a year, in a way nobody notices until it breaks a long run.
Worked example: the session that finishes at 23:58
Start a twenty-five minute focus session at 23:33 and switch tabs. The browser stops updating the display almost immediately. At 23:58 the session ends; your tab is hidden, so nothing on the page notices. At 00:02 you come back.
The session is recorded as having ended at 23:58, not at 00:02 — the deadline, not the moment the page found out. Those four minutes are the difference between yesterday and today, and stamping the session with the wrong one would credit today with work you did yesterday and leave yesterday looking like the day you broke your streak. The page tells you the session finished four minutes ago while the tab was in the background, and adds it to yesterday, where it belongs.
Worked example: the clock-change night in New York
On 1 November 2026 clocks in New York go back an hour at 02:00 local time. Suppose you finish a session at 01:30 that morning, and another the following evening at 23:30. Those two instants are 24 hours apart to the second — and they are the same local day, because the day they fall in was twenty-five hours long. The streak is 1, not 2. The reverse case is just as counter-intuitive: a session at 01:30 on 1 November and another at 00:30 on 2 November are also exactly 24 hours apart, and those are two consecutive days, so the streak is 2. Both cases are pinned as tests, and the second exists specifically to fail the naive implementation.
The sound is made, not downloaded
The end-of-session chime is three short rising tones generated by the browser's own audio hardware. Nothing is fetched, so there is no file to fail to load, nothing for a content blocker to block, and no delay on a slow connection. Browsers block audio until you have interacted with the page, which is why the sound is switched on by your first press of Start orTest sound — worth doing once before you rely on it.
Limitations, stated plainly
- It is a work technique, not a health tool. This page makes no claims about concentration, productivity or wellbeing. It runs a timer and keeps a record; what that is worth to you is your call.
- It is not a reliable alarm. If a sound firing at an exact second genuinely matters, use a device alarm. A browser tab is the wrong tool and no amount of engineering changes that.
- Your history lives in this browser only. It is not synced, and clearing site data will erase it. That is why there is an export button, and it is the real undo.
- The history holds 2,000 sessions. Past that the oldest is dropped, and the page says so rather than losing it quietly.
- Streaks are counted in one time zone. If you move between zones, days are bucketed by whichever zone is set — sessions are not retroactively re-dated.
- 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, and the conditions for the audio exemption.
- MDN: setTimeout — Firefox desktop and Firefox for Android clamping.
- IANA Time Zone Database — the source of the daylight-saving rules your browser applies when a session is bucketed to a local day.
- WCAG 2.2.1 Timing Adjustable — why a timer you set yourself is not a time limit set by the content.
- MDN: autoplay guide — why sound needs a gesture before it will play.
Questions
Can I change the 25 and 5?
Yes — all four numbers are editable, including how many focus sessions come before a long break. Changing the length of the session you are currently running starts that one again at the new length, because a session that changed length halfway through did not run to the duration it was recorded as. Changing a break's length while you are focusing leaves the focus session alone.
What happens if I close the tab mid-session?
The finish time is stored, so reopening the page picks up exactly where it was. If you come back after the session should have ended, it is recorded with the time it actually ended and the page tells you when that was.
Does pausing break my session?
No. Pausing banks the remaining time and gives it back when you resume, and the session still counts as completed when it reaches its planned length. Only Reset and changing the length start it over; Skip records it as abandoned and moves on.
Why did my streak not go up?
Streaks count consecutive local days on which you completed at least one focus session. Two sessions on the same day are one day for streak purposes. Breaks and skipped sessions do not count. And not having worked yet today does not break a streak you built yesterday — the count only drops once a whole day passes with nothing completed.
Can I get my data out?
Yes. Export session data shows every stored session as JSON, which you can copy anywhere. There is no import yet, so treat the export as a backup rather than a transfer.
Will the sound go off if I switch tabs?
Usually, but possibly late — up to about a minute on desktop and longer on Android, because browsers deliberately slow background tabs down. The countdown itself stays exact, and when you come back the page tells you precisely when the session ended.
Does it work with a screen reader?
The counting figure is deliberately silent, because a readout that announced itself every second would be unusable. Instead you get announcements at proportional milestones, plus start, pause, skip and reset, a single alert when a session ends, and anAnnounce time remaining button for reading the value on demand. Every bar in the seven-day chart carries its own total as text, so nothing is conveyed by height or colour alone.
Can I use the keyboard?
Yes. Space starts and pauses, R resets and S skips to the next phase, as long as focus is on the tool and not in one of the number fields. Every control is also a normal button reachable with Tab.