You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Added
A client can be given only the servers you pick. Switch off "Adopt Newly
Added Servers" under Settings on a client's page and a server you add later stays off for that client
until you turn it on; what the client gets today does not change. The
same from the command line with plug clients only <client> --server <name> or --tool <name>, and --off to end it.
Clients lists a client that connects, makes its calls, and leaves again,
such as a script on a timer. It shows where it runs, with "Last used" and
the time, and can be named, given an icon, and kept from servers and tools
like any other client. It stays listed while its last call is in Activity.
Plug's menu bar icon is there whenever Plug is serving. It comes back on
its own when something else closes the app (a quit-all, a crash, a force
quit) and appears after login. Settings has a "Keep in Menu Bar" switch
for it, on by default.
Settings has a Permissions section: whether macOS lets Plug run in the
background, open at login, and send notifications, with the way to System
Settings beside anything that was turned off there.
A server whose tools Plug splits into groups says so on its page: a
Clients See row lists the groups, such as Gmail, GoogleDrive, GoogleSheets.
A Google Workspace server gets its Gmail, GoogleDrive and other groups
under any name you give it, not only workspace: Plug goes by what the
server says it is.
Two servers that would give a tool the same name no longer leave only one
of them. Each gets its own name added to the prefix, so two Google servers
show as GmailWorkspace__… and GmailGoogleWork__….
A client kept from a tool is no longer sent that tool's results through
an event watch. Listing, subscribing and delivery all check the tool, and
an event already queued is dropped when the tool is blocked.
A tool switched off, or kept from a client, stays that way when a second
account changes its name (Gmail__… to GmailWorkspace__…) and when that
account is removed again.
Two servers whose names differ only in punctuation (google-work, google_work) each get their own tool names; one is numbered. If two
servers still claim one name, the second is left out and the log says so,
instead of one silently replacing the other.
Codex CLI can be signed in again from its page in Plug: a Sign In button
runs its sign-in and opens the approval in your browser. Other clients
still sign in from inside themselves, and their page says how.
A client can be given a place: the computer it runs on, such as "Work
laptop". Its page has a Runs On menu for it, and clients with a place are
listed under it. The rest stay under On This Mac and Over the Network.
Activity and plug clients show the place beside the client's name, and plug clients place <client> <place> sets it from the command line.
Each server's page has a Settings row that says where the server's own
settings are and takes you there: the app it runs from, a file its
arguments name, the page it gave for itself, or Plug's own form. Plug
only uses what it already holds and never searches the disk.
Clients has an Add Client button. Pick any client (one on this Mac, one on
the web such as ChatGPT, one Plug cannot find, or one it has never heard
of) and how it connects, on this Mac or over the network. Plug sets up a
client it finds with one button; for any other it shows the command or
address to paste, alone or as a whole settings entry. A client Plug has never
heard of can be given a name and an icon there, which it shows under from
its first connection.
A client whose sign-in to Plug ended says "Needs sign-in" in Clients, with
how to sign it in again, and Plug sends a notification when it happens. plug auth clients list says so too.
Changed
Clients distinguish missing local configuration from hosted access. Network
authorization details show the local HTTP clients represented by that row,
including Codex CLI, without implying an active connection.
A client you name after one Plug knows takes that client's icon: a second
Cursor sign-in renamed "GrokBot" shows Grok Bot's icon, not Cursor's.
Activity shows each call under the name you gave the client that made
it. Two sign-ins that both report "Cursor" are told apart from then on;
calls recorded before this stay as they were.
Quitting Plug asks first. "Quit" closes the app and leaves Plug serving,
with the icon away until Plug is opened again; "Turn Plug Off and Quit"
stops it. Before, quitting left Plug serving without saying so.
Fixed
Two scripts started the same way from different folders, such as python3 main.py, are two clients. They were one, sharing a name and
what they were kept from.
A script that connects on this Mac is called by its own name, or by its
folder when the file is a main.py. It showed as python3 or node,
the same as every other script.
A task's large result is kept with the tool the task ran, so a client is
kept from it only when it is kept from that tool. A client with a block on
anything used to be refused every such result.
A network client's open session ends when its sign-in runs out, not only
when the sign-in is revoked.
The menu bar panel and Activity show a client's icon wherever the
Clients list does: a network client that says nothing about itself is
pictured by its sign-in's name in the panel too, and ChatGPT is found by
the app OpenAI ships now, whatever the owner named it.
A tool switched off for one client is stored by its server and that
server's own name for the tool, so renaming the tool or its server's
prefix cannot switch it back on. Blocks written the old way, by listed
name, are brought over the first time Plug sees the tool, and a rule
with * in it now also holds for a tool that was renamed out from under
it. A large result kept on disk follows the same block whatever the tool
was called when it was kept.
A client kept from a server no longer hears about that server's sign-in,
and a local client kept from a server gets no log lines, as a remote one
already did.
A remote session ends when the sign-in it was opened under is revoked,
not only when the client is removed, and nothing more is sent to it.
A secret command's helper left holding only the error output is stopped.
An environment entry named like another entry's stored key (env.token
beside token) gets its own stored key.
A watch check that was waiting its turn no longer runs after the watch is
removed or while Plug is shutting down.
Servers whose names read alike are numbered around names already in use,
so a numbered name can no longer land on another server and hide its tool.
A remote client's open session ends when its sign-in does, however that
happened, including a removal whose save failed. A client newly kept from
a server stops getting log lines on a stream it already had open.
A watched tool that is slow to answer no longer delays the next check of
the other watches, and is not called again while still answering.
A secret command that runs past its time is stopped together with
anything it started, and one that prints without end is cut off.
Updated rustls to 0.23.45 or later for RUSTSEC-2026-0285.
A server's bearer token and an environment entry named token no longer
share one stored key, and a refused change puts each key back exactly as
it was. A whole server change, keys included, now happens one at a time,
so two changes at once cannot undo each other's keys.
A watch calls a tool on a timer only when the server itself marks the tool
read-only. A tool the server says nothing about needs allow_writes, as a
writing tool does; before, a harmless-looking name was enough.
A large result Plug set aside stays out of reach of a client kept from its
server or tool even after the tool is renamed or the server is removed.
Saving the config writes servers in name order, so the file no longer
reshuffles on every save.
Setting up a client whose config file is YAML that cannot be read leaves
the file alone and says so, where before Plug wrote a fresh file over it.
One watched tool that is slow to answer no longer holds up the other
watches that are due with it.
A secret store command that leaves a program running behind it no longer
hangs the read; it stops at the store's time limit.
A client kept from a tool can no longer read a large result of that tool
that Plug set aside as a file.
An API server's key is not sent on when the API redirects to another port
or from HTTPS to plain HTTP on the same host. Plug also stops reading an
API response, or an API description, once it passes the size limit, where
before it read the whole thing first.
Removing a client's access ends the sessions it has open, where before an
open stream stayed up until it timed out. A session answers only to the
client that opened it.
A client kept from a server no longer receives the log lines servers send.
A server change that is refused, such as adding a server under a name
already taken, no longer replaces the key the existing server works with.
Removing a server keeps a stored key that another account of it still
uses; the key goes when the last one does.
Two servers whose names differ only in punctuation, or a server with a
very long name, no longer share one stored key. Keys already stored keep
their names.
Watching a tool for change follows what the server says about it: a tool
the server marks as writing is not called on a timer because its name
reads as harmless.
A client that runs as several processes keeps its sign-in. Each holds
the copy of the stored token it started with, so one renews and another
presents the used copy later; before, that one was taken for a thief and
the whole sign-in was revoked, which kept signing Codex CLI out. A used
copy from the same client is now accepted for a week. After that, or from
another client, it still revokes everything.
A stored sign-in renews after its client restarts. A client that had not
read Plug's addresses again posted the renewal to /token with no
resource, got nothing, and asked to be approved from scratch. Scripts
built on the MCP Python SDK failed this way an hour after signing in.
Activity shows a network client's icon and name. A call from a client
that says little about itself is pictured by the name on its sign-in, the
way the Clients list already did.
Ditto history and email-manager clients use Python icons while retaining
their distinct workflow names.
HTTP-linked clients no longer have a redundant local configuration row
beside their network authorization. Existing local sessions remain visible;
clients not using Plug have their own section.
Clients follows links made outside the app, such as plug link in a
terminal, within a few seconds. It read them once, when the tab opened.
Running the app's tests no longer leaves a second Plug.app where Spotlight
finds it.
Native OAuth clients such as Claude Code can sign in using temporary
loopback callback ports. Callback host, path, and query remain checked.
With the sidebar hidden, the window's title and count no longer run past
the edge of the first column.
Linking OpenCode or Kilo Code writes the entry where those clients read
it. It went under a key OpenCode does not accept, so OpenCode would not
start and Plug showed it as not linked.
Linking Claude Code over HTTP writes an entry Claude Code accepts.
The top of each column in the window no longer changes when the pointer
moves over it. macOS was fading a line in under the bar on hover.