Dev.to WebDev 🛠 Dev 👁 0 📖 4 min read

The Focus Timer's Number Contract: Four Silent Fixes, Four Refusals

The Focus Timer's Number Contract: Four Silent Fixes, Four Refusals I work on OnePassApps. The Focus Timer is one of the browser tools we ship at app.onepassapps.com, and I spent a run pushing wrong numbers into it to f

The Focus Timer's Number Contract: Four Silent Fixes, Four Refusals

I work on OnePassApps. The Focus Timer is one of the browser tools we ship at app.onepassapps.com, and I spent a run pushing wrong numbers into it to find out exactly what it does with them. The short answer: it quietly fixes some of them, and it names the other four in plain words.

The app opens in Pomodoro mode with four number fields, and each one carries its own range on the input itself. Focus is 25 minutes by default, min 1 and max 180. Short break is 5, min 1 and max 60. Long break is 15, min 1 and max 120. Long break every is 4 sessions, min 2 and max 12. All four carry step 1. The guide page states the same ranges in prose: Pomodoro accepts focus of 1 to 180 minutes, short breaks of 1 to 60 minutes, long breaks of 1 to 120 minutes and a long break every 2 to 12 sessions.

Type a number past the top of a range and the app does not complain. I typed 181 into Focus and the field became 180. 181 into Short break became 60. 181 into Long break became 120. 13 into Long break every became 12, and 1 became 2. 0 into Focus became 1. In every one of those cases no message appeared anywhere on the panel: the field simply held the nearest legal value.

Clear a field instead and you get a sentence, and each field has its own. An empty Focus reads: Focus length needs a number from 1 to 180. An empty Short break reads: Short break needs a number from 1 to 60. An empty Long break reads: Long break needs a number from 1 to 120. An empty Long break every reads: Long break interval needs a number from 2 to 12. While a field is empty the Start button is disabled, and I read that disabled state off the button itself, so a session cannot start on a missing number. The display still showed 25:00 while the field was blank.

Switching the tab to Countdown replaces the four fields with three: Hours, Minutes and Seconds, defaulting to 0, 10 and 0, so the timer reads 10:00. Hours carries min 0 and max 24, Minutes min 0 and max 59, Seconds min 0 and max 59, and the panel says From 1 second up to 24 hours. The silent fixing carries over: 25 in Hours became 24, 60 in Minutes became 59, and 60 in Seconds became 59.

The one second floor is enforced, not just written down. With Hours, Minutes and Seconds all at zero, the Start button was disabled. Set Seconds to 1 and Start came back, so 00:00:00 is not a runnable timer even though every countdown field has a min of 0.

I ran that one second countdown to its end. The display read 00:00, the status line said Time is up. Press Start to run it again., the panel added Countdown finished., and the Start button renamed itself Start again. One small thing changes with the mode: the third button reads Skip to next phase (S) in Pomodoro mode and Restart countdown (S) in Countdown mode. Same keys, different wording, because the key does something different.

The panel says Play a chime when time is up, and there is no audio file behind it. I hooked fetch and XMLHttpRequest.open before touching the timer, and the only request the page made was a feature-flags configuration call to the OnePassApps API host. Nothing audio-shaped was ever requested. On the Web Audio side the chime was built from three oscillator-and-gain pairs, with no buffer source created at all, and the context came up running at 44100 Hz. The oscillator parameters were set on the nodes after the nodes were made, so I am not going to claim a frequency or a timbre.

The app also says: Nothing is stored. Closing this tab clears the timer. The key set backs that up: localStorage held the same four keys before the timer ran and after it finished, a Clerk environment blob, the recent-apps list, the theme preset and the app's own store. No key was added for the timer.

What this is not: one build, one browser, one signed-out session, 11 November 2026. I did not try a non-numeric entry or a fractional number, so I make no claim about what the app does with those. I compared the set of localStorage keys, not every byte inside every value. I did not read the tab title while the timer was mid-run, so the panel's line about the tab title is the app's own wording, not my measurement. The countdown I ran was at its 1 second floor, not at 24 hours.

The Focus Timer is free, needs no account, and it never uses OnePassApps credits. The app: https://app.onepassapps.com/apps/focus-timer?utm_source=devto&utm_medium=post&utm_campaign=focus-timer-numbers&utm_content=app-link The guide: https://app.onepassapps.com/guides/focus-timer?utm_source=devto&utm_medium=post&utm_campaign=focus-timer-numbers&utm_content=guides-link

Questions about how the apps work are welcome, and corrections are better than praise. I write here as the OnePassApps team.

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.