Pomodoro Timer

A 25/5 Pomodoro timer with long breaks, a two note chime, a countdown in the tab title and a daily tally kept in your own browser storage.

๐ŸŒ Espaรฑol

Focus

25:00

Ready โ€” Focus.

0Today
0All-time
Durations & settings

๐Ÿ”’ Private by design: everything runs locally in your browser and never uploaded to any server.

The off-by-one that most Pomodoro apps get wrong

Ask three people when the long break happens and you will get two answers. Before the fourth focus session, or after it?

The rule here is pinned down and worth stating plainly. A counter increments only when a focus phase finishes. When that new count divides exactly by the sessions per long break setting, the next break is the long one. Under the default of four, that means focus, short, focus, short, focus, short, focus, long. The fifth focus session is followed by a short break again, and the second long break arrives after the eighth.

The row of tomato dots above the controls is the visual form of the same counter. During a long break every dot is filled; the rest of the time the filled count is your position within the current set. If you have changed the sessions per long break number, the dot row changes length to match.

Running your first set

  1. Press Start. The phase badge reads Focus and the countdown begins from 25 minutes.
  2. Work. The tab title shows a tomato, the remaining time and the phase, so a backgrounded tab still tells you where you are.
  3. When the clock hits zero the chime plays, your tally goes up by one, and the timer moves to Short break.
  4. Press Pause at any point and Resume to continue. Pausing is reflected in the tab title too.
  5. Skip jumps to the next phase without waiting. Reset returns everything to a fresh first focus session, leaving your tally alone.
  6. Fullscreen hands the whole screen to the clock, which is the setting I actually use. It removes the temptation to look at anything else.
  7. Open Durations & settings to change Focus (min), Short break (min), Long break (min) and Sessions per long break.

Two checkboxes sit at the bottom. Play a chime at the end of each phase controls the sound, and Auto-start the next phase decides whether the break begins on its own or waits for you to press Start again.

Skip and the tally do not agree, on purpose

This is the one behaviour worth knowing before you trust the numbers.

Pressing Skip during a focus session advances the cycle. The counter goes up, the dot fills, and the break is queued. What it does not do is record a completed pomodoro against todayโ€™s date. Only a focus phase that runs all the way to zero is written to storage.

That is the right call for a tally that is meant to mean something. A number you can raise by clicking a button four times is not a measure of focused work. But it does mean the dots and the Today figure can disagree within a set, and if you skip often, the daily number will be lower than the dots suggest. Believe the number.

Time that does not drift

Browsers throttle timers in background tabs, sometimes to once a minute. Any countdown built by subtracting a second per tick loses time, and after an hour in another tab it can be minutes out.

Nothing here counts that way. Pressing Start records an absolute timestamp, and every value on screen is derived from the current clock against that anchor, including the digits, the progress bar and the tab title. Pausing records the elapsed span and resuming sets a new anchor. The consequence is that the display can only ever be right, whatever the browser did to the tab while you were away.

The tab title is deliberately verbose for the same reason. Icon, clock, phase name, and a paused marker when relevant, so a glance at the tab strip answers the question without switching to it.

Two numbers and where they live

Under the controls sit Today and All-time. Both are read from a single entry in this browserโ€™s local storage, keyed by local calendar date rather than by a UTC date, so a session finished at eleven at night counts toward the day you think it does.

Nothing syncs. There is no account, so the tally on one device knows nothing about another, and clearing site data erases it. That is a real limitation and the honest trade for a tool that never asks you to sign in.

Durations are configurable within limits. Any phase can run from 1 to 180 minutes, and the sessions per long break setting accepts 1 to 12. Values outside those ranges, or a field left empty, fall back rather than breaking the cycle.

Tools that pair with a focus block

For a plain countdown with no cycle attached, Online Timer is the simpler tool, and Interval Timer handles repeating work and rest blocks for exercise rather than study.

If it is background sound you are missing during the focus block, White Noise Generator and Binaural Beats Generator both run happily in another tab. Breathing Exercise fits the short break better than scrolling does. To track the habit across days rather than a single session, Habit Tracker is the better fit. The rest is on the testers hub.

See it in action

Screenshot of the Pomodoro Timer tool with a pomodoro timer ready at 25 minutes of focus with four session dots, start, skip and reset, a fullscreen mode, today and all-time counts, and editable focus, short-break and long-break durations
Pomodoro Timer mid-process: a pomodoro timer ready at 25 minutes of focus with four session dots, start, skip and reset, a fullscreen mode, today and all-time counts, and editable focus, short-break and long-break durations.
Diagram: where the work happens on a SysFenix page that has no file input at all: the tool arrives as ordinary JavaScript inside the page, works the answer out on your own device and renders it in place, so the upload, queue and server-side record a typical online tool needs never happen
Where the work happens on a SysFenix page that has no file input at all: the tool arrives as ordinary JavaScript inside the page, works the answer out on your own device and renders it in place, so the upload, queue and server-side record a typical online tool needs never happen.

Frequently asked questions

Does the timer keep correct time when the tab is in the background?

Yes. Nothing counts down by subtracting one from a variable on a tick, which is the approach that drifts when a browser throttles a background tab. Instead the moment you press start is recorded as an absolute timestamp, and every displayed value is recalculated from the current clock against that anchor. Come back after twenty minutes in another tab and the number is right.

When exactly does the long break arrive?

After your fourth completed focus session, not before it. The counter only advances when a focus phase ends, and a long break is handed out when that new count divides exactly by your sessions per long break setting. So the fourth focus session is followed by a long break, the fifth by a short one, and the eighth by the second long break. The tomato dots show your position in the current set.

Does pressing Skip count as a completed session?

It advances the cycle, so the dots fill and the next phase is queued, but it does not add to your daily tally. Only a focus phase that runs all the way down to zero is recorded. That is the honest behaviour, since the tally is meant to answer how much focused time you actually did rather than how many buttons you pressed, but it is easy to misread the dots as agreeing with the number.

Why can I not change the durations mid-session?

The four duration fields lock as soon as a timer is running or paused, and a hint under them says so. Changing the length of a phase that is already partway through would either jump the clock or silently change what the current session means. Press Reset to return to idle and the fields unlock, at the cost of starting the cycle again.

The chime did not play. What happened?

Two likely causes. Browsers refuse to play audio until you have interacted with the page, though pressing Start satisfies that, and separately a browser may delay or suppress sound scheduled while its tab is in the background. The visual phase change always happens regardless. The chime itself is generated live as two short sine tones rising from D5 to A5, so there is no audio file to fail to load.

Where are my daily numbers stored?

In this browser's local storage on this device, under one key, and nowhere else. There is no account and no sync, so the count on your laptop and the count on your phone are separate. Clearing site data or browsing history wipes it. If storage is unavailable, as it can be in private windows, the live count still updates for the session and simply is not persisted.

What happens if the stored data gets corrupted?

It is discarded rather than crashing the page. The stored value is parsed defensively, so anything that is not valid JSON, is not an object, or is an array becomes an empty tally. Individual day entries survive only if they are finite positive numbers, and they are floored to whole sessions. A hand-edited or truncated value costs you the history, not the tool.

Related tools