Tools

AI-generated text

Developer Simon Willison used ChatGPT voice mode to add a newsletters archive to his blog

Simon Willison built a public newsletters index page for his blog using the ChatGPT desktop app in Codex voice mode, working against a local development checkout.

Developer Simon Willison used ChatGPT voice mode to add a newsletters archive to his blog

Simon Willison shipped a Newsletters page for his blog today that indexes all the newsletters he has sent: his free weekly Substack posts and his monthly, sponsors-only updates. He built the feature almost entirely by voice, using the ChatGPT desktop app in the Codex tab’s voice conversation mode against a local development environment while he cooked dinner.

Workflow and Codex voice mode

He started the session against his local simonwillisonblog checkout by instructing the model to "Start dev server and open in browser," which produced a preview of the site for the model to work on and allowed Willison to visually track progress later. He launched the voice chat with the app’s "Start new voice chat" button (not the microphone button) and placed the laptop in the kitchen so he could speak to it while cooking.

Willison had a clear idea of the feature: a new Django model, a migration, view code, templates, and import functions to populate the database from external sources. The Codex model (GPT-6 Astra High) asked clarifying questions and then modified the code according to those spoken instructions. The voice session lasted roughly half an hour — the time it took to cook dinner.

A transcript of the session captures the disfluencies and the design decisions (for example, that the new content type should not appear on tag pages or the homepage but should show up on date-based archive pages). Those requirements shaped the implementation.

What they built with voice assistance

The voice-driven session produced a substantial amount of work:

  • A new Django model and migration to represent imported newsletters, plus Django Admin configuration.
  • Four working import mechanisms:
    • The most recent Substack items via RSS.
    • Other Substack items via an undocumented API endpoint (the model attempted /api/v1/archive, then helped determine how to paginate it).
    • All published monthly newsletters from the simonw/monthly-newsletter-archive GitHub repository.
    • The most recent private sponsors-only monthly newsletter from a private repository.
  • Public archive pages at /newsletters/ and /newsletters/2026/.
  • Newsletters appear on day and month archive pages but not on tag pages or the blog homepage.
  • Weekly Substack newsletters link to Substack; archived monthly newsletters have their own pages.
  • Integration with the site search engine so that monthly newsletters that become public appear in search results.

GPT-6 Astra designed the index page and refined the layout based on Willison’s vocal feedback after he glanced at the local preview.

Where the process required switching to typing

The feature was almost ready to ship, but the imports were the sticking point. Astra offered to export data from the local copy for import into production; Willison preferred the imports to work like his existing scripts. Because some data lived in a private GitHub repository, creating a new API key and handling the private repository access required sitting at the keyboard.

After he judged the feature mostly complete, Codex created a branch and opened a pull request. Willison reviewed the code on the GitHub PR interface and found that one import script used Git in a subprocess. He preferred an API-based import for the private repository, so he switched back to typing and had Codex replace the subprocess approach with an API-based implementation.

He committed fixes and made a few presentation tweaks to the public pages; those changes took an additional roughly half hour of typing prompts before he felt comfortable landing the PR and deploying to production.

Final result and thoughts on the method

The end result is live: the newsletters index page shows his most recent Substack weekly newsletters and GitHub sponsors monthly newsletters mixed together in reverse chronological order, with links to year-by-year archive pages further down. Monthly newsletters have their own pages; weekly Substack items link back to Substack.

Willison notes that while voice-driven demos are popular (for example in OpenAI’s DevDay-style presentations) and they work well for certain tasks, this approach probably won't become his daily driver. The combination of a visual preview and the option to type or paste when necessary makes voice interaction with a coding agent more powerful than phone-based brainstorming alone. However, for detailed work — pasting examples and error messages or directly highlighting code — typing remains more efficient.

He mainly works from home and adds that he would not want to talk to his computer like this in a shared workspace. For him, the killer feature is multitasking: he often cooks while listening to a podcast or short videos, and now he can actually do development work at the same time.

Tags

text-to-speech, ai, openai, generative-ai, llms, newsletter, coding-agents, codex, speech-to-text, site-upgrades