I like to read but, sometimes, I don’t have time to read everything I’d like and I still want the information I could gain by listening to someone – or something – read for me while I’m driving, for example. I had a document like that about a week ago that I wanted to read, but just didn’t have time for: it wasn’t for work so I couldn’t read it there, and I had a rather long drive ahead of me. I’m told reading while driving is even worse than texting, so I decided to abstain from trying that. Plenty of apps already fill this niche, but most of them require a subscription or try to sell you other stuff. One popular example costs $200/year after a three-day free trial. Other options range from half to double that price. My phone does have a “speak screen” option, but that isn’t great either. So, free options are limited and paid options are expensive.

But I still had this text I wanted to read!

This is where I thought: “It is honestly amazing how easy it is to whip up a little app nowadays!”

I gave it maybe thirty seconds of thought before the design popped into my head: I have this little headless computer running Linux sitting on my desk that does odd jobs for me – who doesn’t, right? – so why not have it run a little Python script that grabs jobs from a queue, runs them through text-to-speech, and puts the audio in an S3 bucket? The rest is just UI and glue!

In case that didn’t pop clearly into your head as well, here’s a diagram I sketched for this post.

diagram

Coding can be a bit of a slog while you’re driving, but who needs to code anymore? At the next red light I switched to my phone, opened Claude in speech mode, and explained what I wanted it to write for me. It took me a good 20 km to explain it, have it explain it back to me to make sure it understood, then pull over to put it back in text mode and let it generate the initial draft.

I don’t pay for Claude, but the free version did a fine job. I immediately ran out of free tokens, of course, but it had already produced the first draft.

That first draft didn’t work – of course it didn’t – but it had the basic building blocks of what I wanted. The Terraform was OK-ish, the worker script needed work, and the UI was potable, but not quite there yet. It took many hours the next day to get the thing working, and a bit of tinkering on and off to get it to work the way I like.

This will cost me a few cents a month to run on AWS among the other stuff I already have running there, has cost me nothing to develop, and once I’ve put my usual guardrails in place (BDD and TDD are already there, but I haven’t set up Dependabot, CI/CD, Trivy, Checkov, and end-to-end testing yet) it’ll cost nothing to maintain afterwards. I might open source it once I’m done putting those guardrails in – let me know on LinkedIn or Bluesky if I should.