The Weather Channel used to run on a box in a closet, and now it talks to me
For about a week in August I had a bug where the app told me nothing at all, and it took me an embarrassingly long time to notice.
Not an error. Not a crash. It would announce "Currently in your area" and then stop. Just stop. And the thing about being a screen reader user is that silence is ambiguous in a way a blank screen isn't. If you can see the screen, a missing temperature is an obvious hole. If you're listening, a missing temperature sounds exactly like the app deciding there was nothing more to say. I sat through that sentence probably thirty times before it clicked that the app wasn't being terse. It was broken.
That's most of what I want to talk about here, actually. But first, what the thing even is.
What I built and why
I've been building something called Accessible Weather Center. It's a weather application that recreates The Weather Channel's old local forecast systems — the WeatherStar 4000, the IntelliStar, Weatherscan, the machines that sat in a rack at your cable company and generated those local forecast segments with the smooth jazz underneath.
If you have no idea what I'm talking about, that's fine. If you do, you probably already know that there's a real community of people who care about these boxes. There are folks who have spent years documenting exactly which font the 4000 used in 1991 versus 1994. There are emulators. There are archives of the music. It's a genuinely lovely corner of the internet.
Here's the gap I fell into. Every one of those emulators is a visual recreation. That's the entire point of them — they're recreating a look. And there are plenty of accessible weather apps out there, good ones, that will tell you the forecast perfectly well. But there was nothing that let someone like me actually participate in the WeatherStar thing. I could read about it. I couldn't experience it.
So the whole design rule is that every visual has a spoken counterpart, and neither one is the afterthought. Ten machines are emulated, from the WeatherStar 3000 through IntelliStar 2, each with its own era-correct fonts, colors, layouts, and product names. Sixteen scenes cycle through — current conditions, hourly, extended, almanac, travel cities, airport delays. Four narrators, using the actual recorded voice clips, so Allan Jackson reads your forecast the way he read it in 2003. There's live NOAA Weather Radio streaming. And there's radar, which I'll come back to, because radar is the part I'm proudest of.
The decision I'd defend hardest
The app has no text-to-speech of its own. None. It never speaks to you directly.
This was not the obvious choice and I went back and forth on it. An earlier version had its own speech engine. I ripped it out.
An app with its own voice is an app fighting your screen reader. You get two voices, two speech rates, two ideas about what should interrupt what, and a settings panel where you try to reconcile them. Meanwhile I already have a speech system. It's tuned exactly how I want it, at a rate that would be unintelligible to most people, and I've been using it for years. The correct thing for an application to do is feed that system, not duplicate it.
So Accessible Weather Center just publishes what it has to say, and my screen reader reads it in my voice at my speed. The recorded Weather Channel narration plays over the top, on its own audio channel, ducking the music underneath. Two things that are actually different — a person's voice from 2003, and my screen reader — instead of two things pretending to be the same.
Radar you can walk around in
Radar is the thing that's normally just gone for me. It's a picture. The legend is a color gradient. The interaction is pointing at pixels. There's nothing to read.
So in this app radar is data. There's a mode where I arrow around the map and each cell tells me what's there — how hard it's raining, how far from home, which direction. I can walk a grid outward from my house and hear the storm's shape. There's a separate list of detected storms with their movement and how long until they reach me, and a list of active alerts, and I tab between those modes.
It is genuinely the first time I've had a sense of where weather is, rather than a summary telling me weather exists. When I get that right the payoff is enormous, and when I get it wrong it's very loud. Early on, walking that grid, every arrow press spoke a quick readout and then, about half a second later, spoke a longer one that repeated everything and added the town name. Every press. Twice. Try holding down an arrow key through that.
A week of finding things that had been broken the whole time
I spent the last week doing a lot of cleanup, and the honest theme of it is that almost everything I fixed had been broken for a while, quietly, in ways that produced no error.
That narration silence I opened with? The audio library had been re-encoded to save space — about five gigabytes down to one and a third. The conversion worked perfectly. But there was a separate lookup file listing every clip by its old filename, and it didn't get updated. So the app would find a clip, decide it couldn't confirm what was in it, and skip it rather than risk saying the wrong thing. Which is good behavior. It was doing exactly what I told it to. It just meant most of the forecast quietly evaporated.
Then there was the display, which turned out not to be live. The temperature you heard was captured the moment that screen came up and then never changed. If you left the app sitting on current conditions, it would happily tell you a reading from twenty minutes ago, with total confidence. I'd built a background refresh that dutifully fetched new data and put it in a cache that nothing ever read again.
My favorite one, though, is the tests. I have a few hundred automated tests. They all passed. Except I noticed the total kept changing — sometimes 244, sometimes 234 — and every single run reported success. Ten tests were just... not running. Not failing, not skipped. Never started, and nothing said so. There's now a check whose only job is to count how many tests were supposed to run and complain if the number doesn't match, because a passing test suite that's quietly shrinking is worse than no tests at all. It's a lie you trust.
And then last night, releasing version 0.13, I hit four bugs in a row where each one was hiding the next. The automated build had been failing for weeks on a stale configuration file. Fixed that, and it got far enough to run the tests — which immediately failed, because the test-counting check I'd just praised was comparing file paths in a way that broke on a different version of the runtime. Fixed that, and a dozen tests failed because they needed the 1.3 gigabytes of media that no build server has. Fixed that, and the Windows build finished green while quietly overwriting the installer with a different file that happened to have the same name.
None of those were visible from the outside. The release looked complete the whole time.
What I actually took from this
I've started thinking of silence as the failure mode I have to design against, and I don't think that's only a screen reader thing — it's just that I notice it faster because I live in it.
Every single one of these bugs was something choosing to say nothing rather than say something wrong. The clip resolver skipping uncertain audio. The tests reporting only what they saw. The build overwriting a file without comment. Each of those is a defensible little decision, and stacked together they produce an application that seems fine and isn't.
So the app now writes a crash log and raises a notification if it dies, instead of just disappearing from your system tray. When a test can't check something fully, it says so out loud rather than silently checking less. When narration can't be verified, it falls back to spoken text instead of dropping the sentence. Fail loudly. Especially when your user can't glance at the screen to see whether anything's there.
If you want to try it
The project has a home now: weather.codyhurst.com, with the feature tour, the manual, the keyboard shortcuts and the theme list all in one place.
Version 0.13.0 is out for Windows, macOS, and Linux — grab it from the downloads page, or straight from GitHub releases if you prefer.
Two honest warnings. The builds aren't code-signed yet, so Windows and macOS will both warn you about an unknown publisher — that's me not having paid for certificates, not anything sinister, and the README walks through it. And the media library isn't bundled, because it's 1.3 gigabytes. The app runs fine without it on system fonts with no music, and everything is still fully narrated by your screen reader. The full experience is a separate download.
It's not 1.0 and I'm not going to pretend otherwise. Two of the sixteen screens have no recorded narration at all, because nobody ever recorded a Weather Channel voice reading almanac data. There's no auto-updater. But it works, it's genuinely usable start to finish with a screen reader, and if you've ever wanted to hear a WeatherStar 4000 tell you it's going to rain on Thursday, it'll do that now.
If you try it, tell me what's confusing. Especially tell me where it went quiet on you.
Comments (0)
No comments yet.