Pomodoro Timer

Runs entirely in your browser

Boost productivity with the Pomodoro Technique. Work in focused 25-minute intervals with strategic breaks.

Work

Session 1 of 4

25:00

Settings

25

Work

5

Short Break

15

Long Break

Session Progress

You are on session 1 of 4. After completing 4 work sessions, you'll get a long break.

Runs entirely in your browser. No uploads. Your files stay private.

What is the Pomodoro Technique?

The Pomodoro Technique, named after the tomato-shaped kitchen timer Francesco Cirillo used as a university student in the late 1980s, breaks work into 25-minute focused intervals separated by 5-minute short breaks. After four cycles, you take a longer 15-30 minute break. The fixed cadence reduces decision fatigue and creates artificial deadlines that combat the Zeigarnik effect — the tendency to ruminate on incomplete tasks.
This timer is implemented with setInterval ticking every 1000 ms inside a useEffect hook, decrementing remaining seconds and triggering a state transition (work → break → work → long break) when the counter reaches zero. The interval ID is stored in a useRef and cleared on unmount or pause to prevent timer leaks.
Browsers throttle setInterval and setTimeout in inactive (background) tabs to a minimum of once per second or once per minute depending on browser, but they do not stop the JS execution entirely. To stay accurate when the tab is backgrounded, the timer compares Date.now() against the original start timestamp on each tick, so a 25-minute Pomodoro completes in roughly real time even if the tab was minimized.
When a session ends, the timer plays a notification sound via the HTMLAudioElement API and (with permission) fires a desktop Notification through the browser's Notification API. Both require explicit user permission — Notification.requestPermission() must be called from a user gesture in modern Chrome and Safari — so grant permission on the first manual session start to enable end-of-session alerts.
Audio playback policies in Chrome and Safari require a user interaction before any sound can play. The first Pomodoro you start counts as that interaction, so subsequent sessions can play the bell automatically. Some macOS browsers also require the system sound to be unmuted, which is independent of the page's mute state.
Customization is stored in component state for the session — work, short-break, and long-break durations are sliders/inputs that adjust the seconds-per-phase. There's no persistence to localStorage in this build, so closing the tab resets everything to defaults.
Pomodoro is most effective when you treat the 25-minute interval as inviolable: silence Slack, close email, and resist the urge to switch tasks mid-Pomodoro. If interrupted, restart the Pomodoro from zero rather than crediting a partial session — the technique's original protocol explicitly recommends this.

Common Use Cases

01

Deep work sessions

Focus on a single task for 25 minutes, batch shallow tasks (email, Slack) into the breaks.

02

Study sessions

Time-box reading, problem sets, or memorization. Spaced repetition + breaks improves retention versus marathon sessions.

03

Writing and creative work

Use the timer to overcome blank-page paralysis — commit to writing for one Pomodoro, then judge whether to continue.

04

Coding sprints

Pair the timer with a focused coding goal so you don't drift into Twitter/Reddit between bug fixes.

Frequently Asked Questions

Cirillo found 25 minutes long enough to make real progress on a task but short enough to defer interruptions to the break. There's no neurological magic to the number — research on attention spans suggests anywhere from 20 to 50 minutes works, so feel free to adjust the duration to your task type.
Step away from the screen. Stand up, stretch, drink water, look at something more than 20 feet away to rest your eyes. Avoid context-switching to a different cognitively demanding task — that defeats the purpose of the recovery interval.
Yes. The Settings panel exposes work duration, short-break duration, and long-break duration. Common variants include 50/10 (Ultradian rhythm) and 90/20 (deep work). Pick what fits your task; the bell rings whenever the chosen duration elapses.
The timer automatically transitions to a long break (default 15 minutes). The counter resets after the long break and the cycle starts over. This matches Cirillo's original protocol, which uses the long break as a hard cognitive reset.
Yes. The timer compares Date.now() against the start timestamp on each tick, so even when Chrome and Safari throttle background tabs to once per second or once per minute, the elapsed time stays accurate when you return. You may not get a bell exactly at the zero mark in a backgrounded tab, but the next foreground tick corrects it.
Desktop notifications require explicit permission via Notification.requestPermission(), and the browser will only show that prompt in response to a user gesture (a click). Click Start once after a fresh page load and approve the permission popup; subsequent sessions will fire notifications automatically.
Browser autoplay policies (Chrome, Safari) require a user interaction before audio can play on a page. The first Start click satisfies that gesture; from then on the bell plays automatically at session end.
Not in this build. Settings live in React component state for the lifetime of the tab. Closing or refreshing the tab resets to defaults. Save your preferred durations in your password manager or notes if you change them often.
The original protocol says: discard the in-progress Pomodoro, return to it later, and restart from zero. Counting partial sessions weakens the technique because the 25-minute window is what creates the focus pressure. The Reset button in the UI handles this.
No. Everything — the timer, settings, session count — runs in your browser memory only. There's no analytics on session start/end and no cloud sync.

Advertisement

Runs entirely in your browser — nothing is uploaded