Is Next3Trains accessible?
Justin Clarke-Salt
Accessibility is an area where I’ve tried to include sensible uplifts to support those who need them.
VoiceOver
Each train is read out as a single combined description rather than as a scatter of separate labels, so you get “the 08:42 to Waterloo, on time, platform 4” in one go instead of having to swipe through the pieces. Since version 1.9 that description also includes the reason for a delay and any diversion (“now terminates at Slough”), and station names no longer carry a stray trailing space that VoiceOver read as a pause. Decorative icons and off-screen route cards are hidden from VoiceOver so they don’t get in the way.
There’s a custom rotor for moving between your saved routes, and the app announces things as they happen - when a refresh completes, when the sort order changes, when station search results come back, when the app switches route on its own, when a train’s details or a disruption summary finish loading, and when planned work arrives. Since version 1.11 VoiceOver should read a whole board from top to bottom without being interrupted by refresh activity. Notices that contain links say “Contains links”, and each link is offered as an action so you can open it without hunting for it. The Live Activity now speaks the service type and coach count too.
Text size
The app supports Dynamic Type throughout. Settings, adding a route and the station picker scale up well into the larger accessibility sizes (to about 230%); the main train views and the widgets are capped a little lower, because past a certain point the layout stops being able to show three trains at once, which is the entire point of the app. This is why this support isn’t declared in the App Store accessibility profile - because 200% scaling doesn’t work for this app on iPhone, and the main view actually tops out at about 135% (the largest non-accessibility size).
A few limits are deliberate. In the app, the status badge on each train is dropped from one step above the default text size upwards, and in the widgets from two steps above, because there’s no room for it; the departure time is still tinted by status, a cancelled train keeps its badge in the widgets, and VoiceOver still speaks the status. Watch complications scale their text only a little, because the slots on a watch face can’t grow. And a widget’s VoiceOver read-out can be interrupted when iOS swaps in the next scheduled entry - that happens inside the system, where the app has no say.
Text size doesn’t follow a system setting on the Mac version - macOS doesn’t offer that to apps built the way this one is.
Colour and contrast
Train status is never conveyed by colour alone - there’s always an icon and text as well. The status colours are drawn from a palette with separate light, dark and increased-contrast variants, chosen to meet WCAG AA contrast.
Since version 1.11 status badges draw the word and symbol in the status colour on a light tint of it, rather than white on a solid colour - the old style measured well below the WCAG minimum in Dark Mode and, oddly, got worse with Increase Contrast on. This applies in the app and the widgets. In the Dynamic Island, the icon changes shape as well as colour when your next train is delayed or cancelled.
One exception, and it’s deliberate: the small grey secondary text - station codes, “Updated just now”, operator names - uses Apple’s standard secondary text colour, which in Light Mode falls short of AA at the default contrast setting. It’s the colour used for this kind of text throughout iOS, and turning on Increase Contrast darkens it.
Motion and transparency
Reduce Motion turns off the animated transitions. Reduce Transparency swaps the blurred, glassy backgrounds for solid ones. Both are honoured in the widgets as well as the app.
Touch targets
Interactive controls meet the 44pt minimum size.
Help me test it
I test what I can, but I’m one person and I don’t use these features the way someone who relies on them does. If you use VoiceOver, large text, or increased contrast day to day, I’d genuinely value your feedback - please join the beta or get in touch via the Contact form.