Una nueva función para mi blog, creada con mi voz.
Una nueva función para mi blog, creada con mi voz.
9 de octubre de 2026
Hoy envié una nueva función para mi blog: la página Boletines, que ofrece un índice de todos los boletines que he enviado, tanto mi Substack semanal gratuito como mis actualizaciones mensuales exclusivas para patrocinadores. Creé la función casi en su totalidad usando mi voz, charlando con mi computadora portátil mientras preparaba la cena.
Modo de voz del códice
Utilicé la aplicación de escritorio ChatGPT para esto, en la pestaña Codex, usando el modo de conversación de voz, ejecutándolo en un entorno de desarrollo local. Así es como se ve:

Comencé la sesión en el pago de mi blog simonwillison local escribiendo:
Start dev server and open in browser
Esto me dio una vista previa del sitio en el que estaría trabajando y significó que luego podría pedirle que me mostrara las nuevas páginas para poder seguir visualmente su progreso.
Luego hice clic en el botón “Iniciar nuevo chat de voz”, eso es no el botón del micrófono, está a la derecha, y coloqué mi computadora portátil en la cocina para poder hablar con ella mientras cocinaba.
hablando con mi computadora
Tenía una idea bastante clara de lo que quería construir, y es una característica de Django lo suficientemente simple como para estar seguro de que el modelo (en este caso GPT-6 Astra High) sería capaz de hacerlo. Un nuevo modelo, una migración, algo de código de vista, plantillas y un par de funciones de importación para completar la base de datos desde fuentes externas.
Aquí hay un extracto de mi transcripción de voz capturada por Codex:
Mmm, no lo hacen. Um, este será un nuevo tipo de contenido. Um, no va a aparecer… Oh, espera. Sí, no, no quiero que esto aparezca en mis páginas de etiquetas y en mis páginas de archivo de fechas y… En realidad, no, creo… No lo quiero en las páginas de etiquetas. No lo quiero en la página de índice del blog. Pero creo que quiero que aparezca en las páginas basadas en fechas. Sabes, si navegas hasta el 19 de septiembre y envié un boletín en esa página, creo que quiero que aparezca. Entonces… esto es… entonces creo que probablemente necesitemos un nuevo modelo. La otra cosa es que quiero que se puedan buscar, uh, los de Substack no se pueden buscar, porque en realidad son solo copias de otro contenido s-on en mi blog. Estos mensuales contienen contenido único, y una vez que se publican, como una vez que se hacen públicos un mes después de su publicación, quiero que aparezcan en mis resultados de búsqueda.
¡Aparentemente esto era lo suficientemente claro como para que el modelo supiera lo que quería construir! Puedes leer la transcripción completa, con disfluencias y todo, en este Gist.
Seguimos así durante aproximadamente media hora (el tiempo que nos llevó preparar la cena). El modelo respondía y ocasionalmente hacía preguntas aclaratorias y luego se ponía a trabajar modificando el código.
lo que construimos
Recorrimos un camino sorprendentemente largo enteramente por voz:
- Un nuevo modelo y migración para representar boletines importados en Django, además de la configuración de Django Admin para eso.
- Cuatro importaciones de trabajo:
- Los elementos más recientes de Substack vía RSS
- Todos los demás elementos de Substack a través de su API no documentada, que GPT-6 Astra conocía (intentó
/api/v1/archivedirectamente) y luego realicé una búsqueda para descubrir cómo paginarlo y encontré este artículo de Karen Spinner - Todos mis boletines mensuales publicados desde mi repositorio de GitHub simonw/monthly-newsletter-archive
- Mi boletín privado más reciente exclusivo para patrocinadores de un repositorio privado
- Las páginas de archivo público /newsletters/ y /newsletters/2026/
- Los boletines también aparecen en las páginas de archivo del día y del mes, pero no en las páginas de etiquetas ni en mi página de inicio.
- Los boletines semanales de Substack enlazan con Substack; Los boletines mensuales archivados tienen sus propias páginas.
- Integración con el motor de búsqueda de mi sitio.
Fue casi listo para enviar. El problema fueron las importaciones: Astra se ofreció a exportar datos de mi copia local para que pudiera importarlos a producción, pero quería que funcionara como mis otros scripts de importación. Dado que algunos de los datos vivían en un repositorio privado de GitHub, esto implicaría crear una nueva clave API, y para eso sabía que tendría que sentarme frente al teclado por un tiempo.
Terminándolo con una reseña.
Una vez que terminé de cocinar y consideré que tenía todas las funciones en su mayoría, hice que Codex creara una rama y abriera una solicitud de extracción.
Revisé el código en la interfaz de GitHub PR. Era casi lo que necesitaba, excepto que había elegido usar Git en un subproceso para uno de los scripts de importación. Necesitaba una de las importaciones para extraerla de un repositorio privado de Git, así que pensé que la API sería una mejor opción. Pasé a escribir e hice que Codex lo cambiara por una importación basada en API.
Puede ver los cambios que hice durante la revisión en las confirmaciones adicionales del PR. Arreglé el mecanismo de importación e hice algunos ajustes en la visualización de esas páginas públicas. Me tomó media hora adicional de indicaciones basadas en mecanografía para llegar al punto en el que estaba feliz de implementarlo en producción al obtener el PR.
El resultado final
Puede ver el resultado final en la página de índice de los nuevos boletines o ver la página de un boletín mensual anterior.

La página de índice muestra mis boletines semanales de Substack más recientes y los boletines mensuales de los patrocinadores de GitHub mezclados en orden cronológico inverso. Más abajo en la página hay enlaces a mis páginas de archivo por años.
GPT-6 Astra diseñó la página y luego modificó ese diseño en función de mis comentarios vocales al echar un vistazo a la vista previa local desde el otro lado de la cocina.
Mejor para realizar múltiples tareas que como conductor diario
AbiertoAI amar usar demostraciones basadas en voz como esta para cosas como DevDay, y funcionan bien en ese entorno. Sin embargo, no creo que esto sea un factor cotidiano para mí.
He escrito antes sobre cuánto “trabajo” hago usando el modo de voz ChatGPT en mi teléfono mientras paseo al perro; principalmente investigación y lluvia de ideas, pero ocasionalmente trabajo de desarrollo real al hacer que ChatGPT escriba y pruebe fragmentos de código.
Esto se siente diferente. La adición de la vista previa visual, además de poder escribir o pegar cosas a través del teclado cuando necesito comunicar algo que no funciona vocalmente, hace que esta sea una forma mucho más poderosa de interactuar con un agente de codificación.
Sin embargo, todavía vuelvo a escribir una vez que llego a los detalles de las cosas. Ser capaz de pegar ejemplos y mensajes de error, o resaltar directamente el código o característica que necesita cambiar, sigue siendo más eficiente que tratar de describirlo con palabras.
Trabajo principalmente desde casa, lo cual es bueno porque de ninguna manera quisiera hablar así con mi computadora en un espacio de trabajo compartido.
La característica principal para mí es la capacidad de realizar múltiples tareas. Normalmente cocino con un podcast o TikTok funcionando; ahora puedo construir cosas.
