I work on OnePassApps. The Focus Timer at app.onepassapps.com has four number fields in Pomodoro mode, and I measured how those fields are actually built in the live app on 11 November 2026, signed out, one build. What I found is that each field is two inputs, that the range lives on the second one and not on the box you type in, and that the silent correction to a legal value happens on the keyboard path but not on the scripted path.
One field, two inputs
Typing into Focus is not typing into a number input. The box you see and type in is a text input with an accessible name - Focus, Short break, Long break, Long break every - and it carries no minimum, no maximum and no step of its own.
In the same field container sits a second input: a number input one pixel wide and one pixel tall. That is where the range is written down. It reads 1 to 180 for Focus, 1 to 60 for Short break, 1 to 120 for Long break and 2 to 12 for Long break every, each with a step of 1. Beside each field sit two small buttons, Increase and Decrease, four pairs in all in Pomodoro mode.
So the range you can type past is not carried by the input you type into. The app's own guide says the same numbers 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. A countdown runs from 1 second to 24 hours."
The correction happens on the keyboard path
Type 181 into Focus and press Tab, and the field settles on 180. 181 in Short break becomes 60, 181 in Long break becomes 120, and 13 in Long break every becomes 12. Nothing is printed about it: no message and no warning anywhere on the panel, and the four number inputs then read 180, 60, 120 and 12.
Set the same value from a script and nothing happens. I set the Focus field to 181 with the native value setter and fired input and change events on it, and the field still read 181 afterwards. I am not going to claim why, because I did not read the app's own handler, but the difference is real and reproducible: type a number, move the focus away, and the field settles on the nearest legal value; set the value programmatically and it does not.
What the app does with a wrong number is a separate question, and the fuller write-up of that is The Focus Timer's Number Contract: Four Silent Fixes, Four Refusals. This post is about how the fields are built, which is the layer underneath it.
The shorter version of this layer went out on Telegram Telegraph earlier today, and that is the first publication of these numbers: The Focus Timer's Number Fields Are Two Inputs Each, and a Scripted Value Does Not Get Clamped. This post carries the same measurements with the DOM detail written out.
The countdown carries a different set of fields
Switching to Countdown replaces the four fields with three: Hours, Minutes and Seconds, starting at 0, 10 and 0, so the timer reads 10:00. The ranges move with them to 0 to 24, 0 to 59 and 0 to 59. Typing 25 into Hours leaves 24, 60 into Minutes leaves 59 and 60 into Seconds leaves 59. The small buttons come with them too, three pairs instead of four.
The line under the fields changes at the ceiling
At the defaults the line under the countdown fields reads "From 1 second up to 24 hours." Once Hours sits at its ceiling of 24, the same line reads "A countdown can be at most 24 hours." Two sentences, one control, and which one you get depends on whether you are at the top of the range.
One option belongs to one mode
The Options list differs between the two modes. In Pomodoro it carries three checkboxes: Start the next phase automatically, Play a chime when time is up, and Show a browser notification. In Countdown the auto-advance option is not there at all, and the list starts at the chime. A countdown has no phases to advance through, which is a fair reason for it to be gone, but the panel does not say so.
The floor is one second
Set Hours, Minutes and Seconds all to zero and the Start button is disabled. Set Seconds to 1 and it comes back. I ran that one second countdown to its end and the button came back reading Start again.
What I did not measure
One build, one browser, one signed-out session, 11 November 2026. I did not try a fractional value, a non-numeric entry or a value below the floor, so I make no claim about those. I did not read the app's own event handler, so I describe where the correction appears, the keyboard path, and not why it appears there. I did not check whether the one pixel number input can be reached by keyboard or is announced to a screen reader, so I make no claim about how it is exposed. The localStorage key set was identical before and after the run, but I compared the key names and not the bytes inside the values.
The Focus Timer is free, needs no account, and it never uses OnePassApps credits. Open the timer here: the Focus Timer. The written guide is at the Focus Timer guide.
Questions about how the apps work are welcome, and corrections are better than praise. I write here as the OnePassApps team.
