How long alt text should be
The number everybody quotes appears in no standard. It is still a good default, and knowing why is the difference between following it and being ruled by it.
Where 125 came from
Search for a length and you will be told 125 characters, usually without a source. The figure is real but it is not a specification. It comes from the behaviour of older screen-reader and browser combinations, where the alt value was read in one pass and longer strings could be cut, and from a period when a good deal of assistive technology had a practical buffer somewhere near that mark.
Almost none of that is still true. Current versions of NVDA, JAWS and VoiceOver read the whole attribute, however long it is. What survives is not a technical limit but an attention limit, and that turns out to be the more useful constraint: a listener is getting this as speech, in one uninterrupted run, with no way to skim it and no way to go back a few words without going back to the start.
So 125 is a good default for the reason most good defaults are good. It is roughly one spoken sentence. It is right more often than it is wrong. And when it is wrong, it is wrong in a direction you can see coming.
What actually truncates, and where
Screen readers
In current versions, nothing. The historical cut-off figures that circulate — 125 here, 255 there — describe combinations that were already being retired years ago. Writing to the old limit costs a listener nothing; believing you must is what costs you a chart description.
Search and social previews
This is where length genuinely bites, and it is not accessibility. Systems that lift image text into a snippet or a card cut at their own limits, and those limits are neither published nor stable. If the alt text is doing double duty as marketing copy, that is a reason to keep the first clause self-contained — not a reason to truncate the whole thing.
Content management systems
The real truncation risk in practice. Plenty of platforms cap the alt field at some arbitrary length and silently drop the rest on save. It is worth testing once, on your own stack, with a deliberately long string.