Why bus arrival times jump around
You check your phone: the bus is four minutes away. You check again ninety seconds later and it says seven. This is the single most common complaint about every bus arrival app in Singapore, including ours, and the answer is the same for all of them because we are all reading the same numbers.
The prediction is not a countdown
A countdown is arithmetic. You set a number and it goes down by one every minute, and it is right by construction because it is not claiming anything about the world.
An arrival prediction is not that. Each bus reports its position, and a model estimates how long that bus will take to cover the remaining road to your stop. When the position updates, the model runs again. The new answer replaces the old one, and it is under no obligation to be one minute smaller.
So the number is not a countdown that glitched. It is a fresh answer to the same question, asked again.
What actually moves it
Traffic between the bus and you. The biggest one. A prediction made before a bus hits a jam is optimistic; the correction arrives when the model can see it is not moving.
Dwell time at stops. A bus loading a wheelchair, or a queue of twenty at an interchange, can spend two minutes at one stop. Multiply by the number of stops still between you and it.
Traffic lights. Arterial roads in Singapore have long cycles. Catching or missing one light is worth up to a couple of minutes on its own, and there are several between most pairs of stops.
The bus in front. Buses bunch. When one runs late it picks up the passengers the next one would have taken, so it gets later and the one behind gets faster. If a service shows 2 min and then 3 min for the next two arrivals, you are almost certainly looking at bunching rather than at a sudden burst of frequency.
Why it can go up and never come back down
Occasionally a service will drift upward for several updates - 5, then 8, then 11 - and then show a slash. That usually means the bus that was being predicted from is no longer completing the trip: it has been taken off the route, diverted, or terminated early. The model kept extending its estimate while the vehicle stopped making progress, then dropped it entirely.
The next number you see will be for a different physical bus.
The rule that actually helps
Trust short numbers more than long ones.
A prediction of 2 minutes is made over a short stretch of road with little room for anything to go wrong, and it is usually close. A prediction of 18 minutes is an estimate across a dozen stops, several junctions and whatever the traffic does in the meantime, and it should be read as “not soon” rather than as eighteen.
This is why Whenbus prints the next arrival at 64pt and the two after it small and grey. It is not only a matter of hierarchy. The first number is the one that has earned the size.
What we do about it
Nothing clever, deliberately. We show what LTA reports, we say when we last heard, and when we cannot reach the feed we show the last times we got with a note saying they are old rather than quietly leaving stale numbers on screen.
Smoothing the jitter would make the display calmer and the information worse. A number that moved because the bus hit traffic is telling you something true, and averaging it away would only hide it until it was too late to act on.