-
The kitchen shipped a page.
Simon Willison shipped a
newsletters index on his
blog on 9 October 2026,
almost entirely by voice. He
used the ChatGPT desktop app,
Codex tab, voice conversation
mode — not the microphone
button, the control to the
right of it — against a local
checkout of
simonwillisonblog,
on GPT-6 Astra High. He typed
one line first: start the
dev server and open the
browser. Then he put the
laptop in the kitchen and
talked while he cooked.
Half an hour of disfluent
speech was enough for a new
Django model and migration,
admin config, four imports
(Substack RSS, Substack’s
undocumented archive API,
the public monthly archive,
and the latest private
sponsors newsletter), year
and index pages, day and
month archives, and site
search. The model asked a
few questions and kept
editing. The preview was
visible from across the room.
It was not ready to land.
The private-repo import
needed a new API key, and he
knew that step required a
keyboard. In review, Codex
had used Git in a subprocess
where he wanted the API. He
switched to typing, swapped
that path, tweaked the public
pages, and spent another
half hour before he was
willing to deploy by landing
the pull request. He is
explicit that this is better
for multitasking than as a
daily driver: paste, error
text, and a highlighted line
still beat describing the
same thing out loud. He also
would not talk to a computer
like that in a shared room.
A preview from the counter
is a draft. Sit down for the
step that needs a secret, a
paste, or a line you would
highlight. Land the diff that
shows that path, not the path
the agent guessed while the
pan was on.
Source:
Simon Willison — A new feature for my blog, built using my voice
·
simonwillisonblog#719
·
voice transcript
-
The 1.0 still counted last year.
The same morning, Willison
shipped
ttok 1.0, his
token-counting CLI on
OpenAI’s tiktoken library.
He had just released 0.4,
run the upgrade, piped a
file in, and found the new
binary still defaulting to
the GPT-4 tokenizer. The
default should have been the
GPT-5 / GPT-6 family.
Switching that default was
the reason he called it 1.0.
OpenAI has not confirmed
that GPT-6 uses the GPT-5
tokenizer. There is an open
argument about it. What
Willison did find is a
comparison by William Liu:
seven GPT models — 5.5, 5.6
Sol, Terra, and Luna, and 6
Astra, Sol, and Luna —
reported 44,794 tokens and
matched each other on every
one of 31 fixtures. On that
corpus, GPT-6 introduced no
input-count change.
A version number is not a
measurement. Pipe one file
you already know through the
counter you actually call,
and write the number next to
the model you bill. A match
on 31 fixtures is evidence
for that corpus. It is not a
promise for the next prompt,
and a vendor silence is not
a confirmation.
Source:
Simon Willison — ttok 1.0
·
ttok 1.0 release
·
William Liu, token-count comparison
·
tiktoken#608
-
The hook that never started let it through.
Claude Code 2.1.295, dated
8 October 2026, adds
onFailure: "block"
for command and HTTP hooks.
A hook that cannot start,
times out, or exits with an
unexpected code can now
block the action instead of
letting it through.
That is a different door
from a sentence a judge
misreads. This one is the
process itself. The hook
never produced a decision,
and the old path was to
continue. The changelog
says the setting was added.
It does not say every
install now fails closed
when a hook dies. If you
want a dead hook to stop the
call, you set the failure
policy, then you break the
hook on purpose.
A hook that exists is not a
hook that ran. Missing
binary, timeout, bad exit:
if the action still happens,
you do not have a deny. You
have a process that was
optional.
Source:
Claude Code changelog — 2.1.295, 8 October 2026