Work and break cycles on a monotonic clock, so a session is not ended by the system clock changing, with the running session and today figures kept if you reload.
Initializing in your browser…
A stopwatch and a countdown on a monotonic clock, so neither loses time to a pause, a background tab or the system clock changing. Lap splits that add up, and a countdown that survives a reload.
Every fact about an IPv4 or IPv6 block, plus splitting, merging, range to CIDR, and which special-purpose range an address falls in
Your public IP address, checked against the IANA special-purpose registries so a private or shared address is named rather than called public, with the location shown as the estimate it is.
You are deep in a refactor and want a focus rhythm that forces short recovery breaks without you watching a clock.
Configured cycle
Focus 25m · Short break 5m · Long break 15m after 4 focuses
Planned afternoon
13:00 Focus (25m) → 13:25 Break (5m) 13:30 Focus (25m) → 13:55 Break (5m) 14:00 Focus (25m) → 14:25 Break (5m) 14:30 Focus (25m) → 14:55 Long break (15m) Focused work this block: 1h 40m
The Pomodoro technique trades marathon sessions for fixed focus/break intervals so attention stays high and breaks are non-negotiable. The timer auto-advances between phases and tracks completed focuses toward the long break, so you only have to follow the prompt, not do the bookkeeping.
Work and break cycles read from a monotonic clock, so a session is not ended by the system clock changing. The running session and today figures are kept in this browser, so a reload picks up where you were.
**The system clock changing.** The version that shipped before September 2026 counted down against `Date.now()`, the wall clock, and the wall clock jumps: daylight saving moves it an hour twice a year and the time daemon steps it whenever the machine has drifted. Measured on 2026-09-04, a running 25 minute session given a one hour clock step did not just show a wrong number, it ENDED: the display went from 24:59 to 05:00 and the page moved straight to a short break, crediting a pomodoro nobody had worked. This version reads `performance.now()`, which is monotonic and is specified never to jump, and the same measurement leaves the session exactly where it was.
**A reload.** Nothing was written down. A session two and a half minutes into a one minute countdown went back to 01:00 on a reload, and the completed pomodoros, the minutes worked and both streaks were component state that vanished with it. Here the running session and today figures are written to this browser, picked up with the elapsed time taken off, and a saved value of the wrong shape is refused rather than breaking the page.
**A link somebody typed.** Every setting was read with `parseInt(x) || default`, which swallows a zero, truncates a decimal and accepts anything else. `?workDuration=0` opened at 25 minutes, `?workDuration=8.5` opened at 8, `?sessionsBeforeLongBreak=0` made every break a long one because a counter that must reach zero already has, and `?workDuration=-5` and `?workDuration=99999` rendered clocks reading "-5:00" and "99999:00", a session whose deadline is already past and one lasting sixty nine days. Every setting is now range checked and anything outside its range is clamped and named on the page.
**A background tab.** A browser throttles a background tab to about one timer callback a second, and to one a minute after five minutes, and no page can do anything about that. What a page can do is compute the remaining time from the clock rather than counting it down, so the reading is correct the moment it runs again, and say how late it noticed. Starved of every timer callback for four seconds, this timer reads the right remaining time to within half a second.
**And the cycle itself was already right,** which is worth recording rather than quietly claiming: with two sessions before a long break, stepping through gives Focus, Short Break, Focus, Long Break, and it does so both in the module and when the page is driven. A first measurement said it never reached a long break, and that was the test reading the three mode BUTTONS, all three of which carry a session name, rather than the selected one.
One thing this page cannot tell you, and says so: the 25 and 5 minute figures are conventions of Francesco Cirillo technique rather than a measured optimum. There is no document to check them against, so they are labelled as conventions where they appear.
A one minute focus session skipped after 1.2 seconds credits one pomodoro and zero minutes, because the minutes credited are the minutes actually run. The shipped version added the whole configured duration whatever had happened.
The session survives a reload, a background tab and a clock change, so the count means something at the end of it.
Deep Work at 50 and 10, the 52/17 rule, or anything between one minute and three hours.
The share link carries every setting, range checked when it is opened.
The time keeps being counted, because it is computed from a clock rather than counted down a tick at a time. What stops is the drawing and the chime: a browser throttles a background tab to about one timer a second, and to one a minute after five minutes. The display is correct again the instant you return, and the page says how long ago the session really ended.
No. The running session and today figures are kept in this browser. They reset at midnight local time, because the panel says today.
Because it is the convention of the technique, not because anything measured it. The same goes for the 5 minute short break and the four sessions before a long one. Nothing here can tell you what length suits you, and the settings panel says so.
It counts toward the set, because you chose to end it, and it credits the minutes it actually ran rather than the length it was set to.
This runs as client-side JavaScript. Keys, tokens, payloads, and other inputs never leave your device.