跳到正文
SNsimonwillison.net·

A new feature for my blog, built using my voice

时间与来源

时间显示为 UTC

显示时区:UTC

本地时区尚不可用,暂时显示 UTC。

发布当时偏移:UTC+02026年10月9日 12:54 UTC

收录当时偏移:UTC+02026年10月9日 13:00 UTC

发布
2026年10月9日 12:54
收录
2026年10月9日 13:00
来源类型
未分类
信源状态
正常

9th October 2026

I shipped a new feature for my blog today: the Newsletters page, which offers an index of all of the newsletters I’ve sent out, both my free weekly Substack and my monthly sponsors-only updates. I built the feature almost entirely using my voice, chatting away to my laptop while I cooked dinner.

Codex voice mode

I used the ChatGPT desktop app for this, in the Codex tab, using the voice conversation mode, running against a local development environment. Here’s what that looks like:

I started the session against my local simonwillisonblog checkout by typing:

Start dev server and open in browser

This gave me a preview of the site that it would be working on, and meant that I could later ask it to show me the new pages so I could visually track its progress.

Then I clicked the “Start new voice chat” button—that’s not the microphone button, it’s the one to the right of it—and set my laptop up in the kitchen so I could talk to it while I cooked.

Talking to my computer

I had a pretty good idea of what I wanted to build, and it’s a simple enough Django feature that I was certain the model (in this case GPT-6 Astra High) would be able to do it. A new model, a migration, some view code, templates, and a couple of import functions to populate the database from external sources.

Here’s an extract of my voice transcript that was captured by Codex:

Um, they do not. Um, this is going to be a new type of content. Um, it’s not going to show up... Oh, hold on. Yeah, no- I do not want this to show up in my, um, tag pages and date archive pages and... Actually, no, I think... I don’t want it on the tag pages. I don’t want it on the, um, blog index page. But I think I do want it to show up on the date-based pages. You know, if you navigate to September the 19th, and I sent a newsletter on that page, I think I want that to show up. So... this is- so I think we probably need a new model. The other thing is that I want them searchable, uh the Substack ones are not searchable, because those are actually just copies of other s- on content on my blog. These monthly ones do contain unique content, and spe- and once they’re... published, like once they’re made public a month after they’ve gone out, I want them to show up on my search results.

Apparently this was clear enough that the model knew what I wanted to build! You can read the full transcript, disfluencies and all, in this Gist .

We went on like this for about half an hour (the time it took to cook dinner). The model would reply and occasionally ask clarifying questions, then get to work modifying the code.

What we built

We got a surprisingly long way entirely by voice:

- A new model and migration to represent imported newsletters in Django, plus Django Admin configuration for that

- Four working imports:

- The most recent Substack items via RSS

- Every other Substack item via their undocumented API, which GPT-6 Astra knew about (it tried /api/v1/archive directly) and then ran a search to figure out how to paginate it and found this article by Karen Spinner

- All of my published monthly newsletters from my simonw/monthly-newsletter-archive GitHub repository

- My most recent private sponsors-only newsletter from a private repository

- The /newsletters/ and /newsletters/2026/ public archive pages

- Newsletters showing up on day and month archive pages too, but not on tag pages or my homepage