Real Agent Cases

Build a blog feature by voice with Codex while cooking

Posted
by Simon Willison
Last checked
Method:
How we verify

Evidence: Screenshots or logsThe source shows screenshots, a transcript or the agent's output.

Outcome

Talking to Codex in voice mode while cooking dinner, the author got a Django newsletters archive with four importers and a pull request, then finished the rest with typed prompts.

Agent

OpenAI Codex (ChatGPT desktop, voice mode)

Prompt Recreated prompt

The source didn't share its exact prompt, so we wrote this from what it describes.

Build a Newsletters page for my Django blog: add a model and migration for imported newsletters with Django Admin support, import my Substack issues (RSS plus the archive API) and my monthly sponsor newsletters from GitHub, add date-based archive pages and search integration, then create a branch and open a pull request.

Try this in:

Sends the Recreated prompt shown above. ChatGPT and Grok open with it filled in, and ChatGPT may send it straight away. Gemini opens empty, so we copy the prompt for you to paste. Every button also copies it.

Opens in a new tab. We don't see what you send.

These links are only a shortcut. We're not affiliated with OpenAI, Google or xAI, and your results may not match the source.

Optional stronger version

Our rewrite with extra checks. The poster didn't test it.

Goal: Add a Newsletters section to my Django blog and open a pull request.

Inputs (fill in or confirm):
- Repo and branch naming
- Substack RSS URL and archive API endpoint
- GitHub location of the sponsor newsletters

Rules:
- Add a model, migration and Django Admin for imported newsletters.
- Write an idempotent import command for Substack (RSS plus archive) and the GitHub newsletters; re-running must not duplicate.
- Add date-based archive pages and include newsletters in site search.
- Write tests for the importer and the archive views.
- Keep imported content's original publish dates and canonical links.
- Write a short plan before coding and read it back to me.
- Keep each importer separate and idempotent so reruns don't create duplicates.

Checkpoint: Open the PR as a draft; don't merge or deploy.

If you get stuck: If an API needs credentials, stop and ask rather than hard-coding anything. If a login, CAPTCHA or two-step code appears, stop and ask me to handle it; never guess or store passwords.

Verify before you finish: Run migrations and tests locally; import a sample and check an archive page renders.

Output: The PR link, a summary of changes and test output.

Done when: the PR imports both sources without duplicates and the archive pages work.

Source

https://simonwillison.net/2026/Oct/9/built-using-my-voice/

  • Migrate two websites from WordPress to Wagtail with Claude CodeRecreated promptEvidence: Described by poster

    Over a weekend Claude Code migrated two sites from WordPress to Wagtail (PHP to Python), including server setup, data transfer, testing and fixes, and redesigned a homepage; the poster reports nothing broke and traffic and tools stayed in place.

    Claude Code · Coding · Source date:

  • Claude Code (Sonnet 4.5) wrote every line of code and every test for the datasette-os-info plugin with minimal prompting, and the author shipped it.

    Claude Code · Coding · Source date:

  • From a single informal prompt, Claude Code built a working 3D game for placing buildings and driving around in about four minutes; follow-up prompts added a fire truck, traffic, and fires.

    Reported by One Useful Thing:Working game in about four minutes

    Claude Code · Coding · Source date: