
And what it took to make a machine read them the way a person would.
I’d gotten into the habit of throwing questions at Gemini’s Deep Research, a service by Google that uses a multi-step mode: it develops a plan, finds relevant data, then synthesizes a report based on the findings. It’s a process that can take several minutes. My searches were typically something simple, but with a suspicion there might be more than a surface answer. The reports it handed back were always more than my ADHD mind could actually read all the way through. Long, cited, thorough, and completely daunting on a screen. One day getting in my car, I dropped the document into the ElevenLabs reader and just listened while I drove.
It was better than half the podcasts sitting in my Pocket Casts queue.
And the reason it was better is that these rabbit holes go somewhere. A simple question about the filmmaker Mike White’s history cracked open a whole inquiry into the “Wesleyan Mafia” and its outsized grip on film and TV culture. A question about kolaches turned into a tangled, wonderful story connecting Czech immigrants, Lewis and Clark, and the donut empire built by the Cambodian diaspora. I wasn’t reading term papers. I was listening to something that wandered exactly the way my own curiosity does. Kelly got so tired of hearing what I was finding out that I set out to figure out a way to share it with the wider world!
So the thought seemed simple: if I already enjoy the audio version of a research report, surely I can iron out the kinks and package it into something other people would also enjoy listening to. It turned out to be much harder than that sentence makes it sound. But the end result is something I’m genuinely proud of. It lives at questions.brenner.social, where every episode exists twice: as the original Google Gemini research article you can read and as a narrated podcast episode you can listen to.
The part I got wrong first
My instinct was to automate the whole thing inside the language models. One question in, one finished episode out, all of it handled by the AI. That never worked. The results were too inconsistent to trust. When a single giant call failed, it failed completely, and it failed often.
The version that actually runs is the opposite of that. It’s a chain of small tools, each one good at exactly one job, stitched together by Python. That reframing is the real story here. Not “which AI is smartest,” but “which tool do I hand this specific job to, and how do I get them to cooperate.”
The technology and the name
I knew from the start I wanted to host the audio and the public pages on Cloudflare, using Workers and R2 storage. I used Claude Code to do the heavy lifting of building the actual site, and I bounced branding ideas off a separate Claude project until something stuck. For a while the whole thing was just called “deep-research,” which is accurate and boring. It became Ben Brenner Asks Stupid Questions, which is accurate and honest.
Teaching a machine to read aloud like a person
This is the heart of it, and it’s the part the tools don’t solve on their own.
I wanted the blog to show the original research paper, more or less intact. But an audio version can’t just read that paper straight through, because a research document is built for the eye, not the ear. Gemini Deep Research loves tables, and tables read without context sound awful. So I kept asking myself one question: what would I do if I were reading this page out loud?
Two answers matter most.
When a person reading aloud hits a table of data, they don’t recite the cells. They pause, look at it, and summarize it. They tell you what it means, or give you the context, instead of reading numbers into a void with no explanation of why the prose suddenly went robotic.
And when a person finishes a section and sees the next heading, they don’t barrel straight into it. They pause for a beat, read the section title, take a breath, and then begin. That small human rhythm is most of what separates a listenable episode from a text-to-speech dump.
So the rewrite step has to reproduce both of those instincts. That’s the job I hand to the model: not “read this,” but “read this the way a person would.”
The machine, end to end
Here’s what actually happens when I make an episode. Most of my effort is asking the question. It’s never just “tell me about x.” That’s nearly guaranteed to come back dull. I ask lateral questions around the subject. What are its origins? How does it fit inside the larger context? How do prevailing stereotypes align (or contrast) with it?
I hit submit, get the result, then let the real work begin.
I export the Gemini research doc into Google Docs, then point a Docker image, running on a Lightsail server, at that shared doc to ingest a markdown version of it. From there it’s a small assembly line:
A Python script reads the markdown and uses clues in it to break the piece into sections. Each section gets sent to Gemini Flash with instructions to rewrite it for the ear: flatten the tables into spoken prose, drop the markup, handle the section breaks the way a human narrator would. Words that text-to-speech tends to mangle get checked for pronunciation and then swapped out with grep, so the spoken copy quietly differs from the printed one while the version on the blog stays clean.
Then the audio. I started on the ElevenLabs API, and it sounds wonderful, but the cost was prohibitive at any real volume. I switched to Gemini’s TTS model, which is much cheaper and almost as capable. The catch is that it wants small bites, so I send it a single paragraph at a time. The container then combines all of those individual paragraph clips into one continuous audio file, and uploads it alongside the cover image and the original text to a Cloudflare Worker for the public-facing part.
None of these steps is clever on its own. The Python script is not doing anything a Python script hasn’t done for twenty years. But it’s the thing holding the whole fleet of AI tools in formation, and that consistency is what makes the pipeline trustworthy instead of magical.
The look
The visual identity landed on a naturalist’s field journal: Darwin on the Beagle, Lewis and Clark, pen and ink with a single wash of color and notes scrawled in the margins. A show about not being able to stop noticing things should look like the notebook of someone who couldn’t stop noticing things. The covers come from Gemini’s image model (Nano Banana Pro) driven by structured JSON calls, so the style stays consistent from episode to episode instead of getting rebuilt from scratch every time.
What it was really about
The through-line of this whole project is a slightly absurd one: I used AI to craft AI. And the lesson wasn’t the one I expected. I came in believing the win would be one perfect prompt. It wasn’t. The clever-prompt phase produced the unreliable version I had to throw out.
What actually made it work was asking Claude and Claude Code the right questions, then trying, testing, and sometimes going all the way back to the drawing board. It meant running Claude, a Gemini subscription, the Gemini API, and ElevenLabs on the same project, because sometimes one tool just isn’t capable of everything, and sometimes a simple Python script is exactly what you need to pull the pieces together into something that holds.
The stupid questions get answered. But the thing I actually built was the machine that elevates them.