Skip to content
Connectorsmedium signalverified

Willison's new plugin takes an API key through a web form, not through the agent

Simon Willison released llm-keys-ui 0.1 on September 20, 2026. The plugin serves a small page from the machine where LLM is installed, and a key typed into that page is saved straight into the key store. Nothing has to be pasted into the coding agent running on the same machine. The interface has no authentication, and the project tells the operator to stop the server once the keys are in.

By Redakcija WebAiRadarPublished 3 min readwritten by a model
Image: Simon Willison’s Weblog

Source

llm-keys-ui 0.1

Simon Willison’s Weblog · Original published September 20, 2026

An API key pasted into a coding agent's session does not stay in the terminal. It becomes part of the transcript, and it travels wherever that transcript travels. On September 20, 2026, Simon Willison published llm-keys-ui 0.1, a plugin for his LLM command-line tool that takes the key in through a web form on the machine instead. The agent is asked to start the server. It is never handed the secret.

What the plugin adds

LLM already keeps keys in a keys.json file and manages them with llm keys set, llm keys get, llm keys list and llm keys path. The plugin adds one more command, llm keys-ui, which starts a small web server and serves a form for saving a key under a name. The value lands in the same store the rest of LLM reads from, so a later shell command can pull it back with llm keys get anthropic.

The useful part is where the key is typed, not how the form looks. Willison says he runs coding agents on remote machines and drives them from his phone, and that he did not want to paste API keys into those agent sessions. With the plugin installed, the agent is told to start the server and report the address, and the key is entered in a browser, outside anything the agent records.

  • llm keys-ui serves the form on 127.0.0.1:8010 by default.
  • -p or --port changes the port, and -h or --host changes the interface it listens on.
  • --all listens on 0.0.0.0 and prints an address for every IPv4 address the machine holds, which covers a local network or a Tailscale device.
  • Stored key values cannot be read back through the interface, which only writes.

The form has no authentication

The project is direct about the limit: the interface implements no authentication at all. Anyone who can reach the port can open the form. Stored values are not shown, so a visitor cannot read a key that is already saved, but nothing prevents that visitor from writing one. The advice in the README is to stop the server as soon as the keys are set.

This suggests the plugin moves the risk rather than removing it. On a laptop that is the end of it, because the form is bound to the loopback address and nothing outside the machine can reach it. With --all, an unauthenticated form is served over plain HTTP on every interface, so the exposure is as wide as the network and the gap between starting and stopping should be short.

The rule is older than the plugin

The same separation can be arranged without this package. Any path that puts a secret on a machine while going around the agent will do: an environment file written over SSH, a secrets manager the agent may call but not read, or a value the operator enters directly. What the release makes concrete is that an agent transcript is not a place for secrets.

One possible explanation for the gap is that key handling in command-line tools was designed for a person at the terminal. llm keys set asks for the value separately and keeps it off the command line, which is exactly right for a human and worth little when the thing at the keyboard is a model that records everything it sees.

„The interface does not implement authentication.“
llm-keys-ui README

Sources

Related

AI Chatbot Assistants on Glass Blocks, Artificial Intelligence Technology Concept. Digitally generated image. 3d render.
Connectorsstrong signal

The same SSRF bug turned up in MCP servers at Google, JPMorgan, and two governments

An independent researcher reported one class of server-side request forgery to five organizations that share no code, and all five confirmed and fixed it. Google's MCP Toolbox for Databases carried a high-severity CVE until version 1.5.0. Five US federal servers are still open. If you run an MCP server with any tool that fetches a web address, the four checks at the end apply to you.

Ars Technicaverified

Five Muse gadgets from Meta's repository: a round AMOLED board and a small stick device showing pixel avatars, the white Muse Home Link, a line drawing of a Raspberry Pi, and an e-ink display with a daily briefing.
Connectorsmedium signal

Meta open-sources Muse Gadgets, which lets its Muse agent run shell commands on a Raspberry Pi

Meta published the Muse Gadgets repository on October 2, 2026, under the Apache 2.0 license. It contains firmware for ESP32 boards and a Linux device SDK that turns a Raspberry Pi into a device its Muse agent can operate. On Linux, Muse runs shell commands with the permissions of the account you install it for, including sudo if that account has it. Meta's documentation says pairing has no manufacturer verification and cannot prevent an active man-in-the-middle attack.

Metaverified

Illustration of plugin extensions across the ChatGPT sidebar, settings, composer, conversation, and side panel.
Connectorsstrong signal

ChatGPT plugins can now run as sidebar apps and react to events from connected tools

OpenAI opened the interface layer it uses for its own ChatGPT features to outside developers. A plugin can now claim a place in the sidebar, open a panel beside a conversation, and act as the viewer for its own file types. A separate MCP Events integration lets a plugin start an automation when something happens in a connected app, which requires MCP 2.0 and webhook delivery. Sign in with ChatGPT lets a Plus or Pro allowance be spent in 16 partner tools.

OpenAIverified