Countdown Timer
Count down from the minutes and seconds you set, and play a short tone at zero.
🔒 Processed entirely in your browser — nothing you enter here is ever uploaded.
Result
About this tool
The form opens with 5 in the minutes box and 0 in the seconds box. The display uses the shared clock formatter without centiseconds, so that duration reads 05:00. Minutes are whatever non-negative number is in the box. The minutes field is marked with a maximum of 999, and the script itself only forces a negative minute value up to 0. Seconds are clamped to the range 0 through 59. The remaining time is minutes times 60 plus seconds, times 1000, in milliseconds. There is no separate hour field. Ninety minutes display as 90:00, not as 1:30:00.
Start does nothing when the remaining time is already 0. Otherwise it records a deadline of performance.now() plus the remaining milliseconds and ticks with requestAnimationFrame. Each tick sets the remaining time to the deadline minus the current time, so a tab that the browser has frozen does not tick one frame at a time when you come back. It jumps to whatever is left, and if the deadline has passed it lands on zero. At zero the button label returns to Start, the status line reads Time is up., and the tone plays once. Pause cancels the frame, keeps the remaining time on the display, and sets the button back to Start. The next start continues from that remainder rather than from the original boxes, until you reset.
The tone is a sine oscillator at 880 Hz into a gain of 0.08, started immediately and stopped 0.35 seconds later. Each beep builds a new audio context and closes it when the oscillator ends. There is no loop, no choice of sound, and no vibration. Reset stops the frame, copies the minutes and seconds boxes back into the remaining time, restores the Start label, and sets the status to Set a duration and start the countdown. Editing either box while the timer is stopped also copies the boxes into the display. Editing them while it is running does not change the deadline. A preset page writes a minute count into the minutes box and sets seconds to 0. It does not press start. The timer is local. Nothing is scheduled on a server, and leaving the page abandons the deadline because the deadline lives in this document's performance clock. There is no lap list and no count-up mode. The stopwatch is the page that counts up. 90 seconds, entered as 1 minute and 30 seconds, display as 01:30. Entering 90 in the seconds box is clamped to 59 before the countdown starts.
Example. The form opens at 5 minutes and 0 seconds and displays 05:00. Start runs until 00:00, then the status reads Time is up. and a sine at 880 Hz plays for 0.35 seconds. A zero duration does not start.
Limit. There is no hour field, so 90 minutes display as 90:00. Seconds are clamped to 0–59. A hidden tab jumps to the deadline instead of ticking in the background. The tone does not repeat.
What does the page show before I press start?
05:00, from the default 5 minutes and 0 seconds. The display is minutes and seconds, padded to two digits, with no centiseconds and no hour field. A preset page changes the minutes and clears the seconds, and it still waits for start.
What happens if I switch tabs?
The deadline was stored as a timestamp. When the animation frame runs again, the display jumps to the time left. If the deadline has already passed, it shows 00:00, says Time is up., and plays the tone once.
What is the sound?
A sine wave at 880 Hz, gain 0.08, lasting 0.35 seconds. It plays once. There is no second beep and no volume control. The browser has to allow the audio context.
Does pause restart from five minutes?
No. Pause keeps the remaining time, and the next start continues from it. Reset is what reloads the minutes and seconds boxes and restores the ready status. A duration of zero never starts.