Description
Head Down Timer does one thing: it times how long your head has been tilted down.
It reads your head angle from the motion sensors in the AirPods you are already wearing. Nothing to stick on, no camera, nothing extra to charge.
Two modes, both with the cost in plain sight
- Single session: it reads while it is open and stops when you close it. No background permission, no extra battery drain.
- Always-on guard: it keeps reading after you switch away or lock the screen. The cost is that it holds the headphone audio route while in the background. A cost bar on the main screen says what is being spent right now. That bar is the core of this app, not an option buried in Settings.
Calibrate first, then count
The pitch angle the system reports has no defined zero, so the first run requires a calibration. Sit normally, tap once, and the app records your own neutral position; every angle after that is measured against it. The neutral position drifts along with you, and you can recalibrate any time.
One cue, and only one
It sounds only after you pass the angle you set and hold it long enough. Four cue sounds, and a minimum interval you control so it never nags in a row. Sound only: no haptics, no notification banners.
No numbers the sensor did not produce
Not worn, disconnected, audio route taken by another app, lying down: the angle shows a dash and the graph freezes. Better blank than an angle from several seconds ago. However long the system suspended the app, the review screen says so instead of pretending it kept running.
Review
Today and this week: cue count, total minutes down, longest single stretch, share of time with your head up, with hourly and daily graphs.
Your data never leaves this device
No network, no account, no third-party SDK, no tracking of any kind. Angles, counts, and your calibration live on your phone and disappear with the app.
Works with AirPods (3rd generation), AirPods (4th generation), AirPods Pro (all generations), and AirPods Max. AirPods 2 and earlier lack the required sensor; the app's runtime check at launch is what decides.