<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Plexus changelog</title>
  <subtitle>Every Plexus release, newest first.</subtitle>
  <link rel="alternate" type="text/html" href="https://runplexus.com/changelog"/>
  <link rel="self" type="application/atom+xml" href="https://runplexus.com/changelog/atom.xml"/>
  <id>https://runplexus.com/changelog</id>
  <author><name>Plexus</name></author>
  <updated>2026-10-29T00:00:00Z</updated>
  <entry>
    <title>v1.3.1 — Bitbucket&apos;s new SSH address</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v1.3.1"/>
    <id>https://runplexus.com/changelog#v1.3.1</id>
    <published>2026-10-29T00:00:00Z</published>
    <updated>2026-10-29T00:00:00Z</updated>
    <summary>Bitbucket is moving git over SSH to a new address. This release makes sure Plexus keeps up with the move, and offers to update your projects for you.</summary>
    <content type="html">&lt;p&gt;Bitbucket is moving git over SSH to a new address. This release makes sure Plexus keeps up with the move, and offers to update your projects for you.&lt;/p&gt;
&lt;h2 id=&quot;bitbuckets-new-ssh-address&quot;&gt;Bitbucket&apos;s new SSH address&lt;/h2&gt;
&lt;p&gt;Bitbucket is moving git over SSH from &lt;code&gt;bitbucket.org&lt;/code&gt; to &lt;code&gt;ssh.bitbucket.org&lt;/code&gt;. From 12 November 2026, Bitbucket will block SSH on &lt;code&gt;bitbucket.org&lt;/code&gt; during scheduled windows that get longer each week, and on 10 December 2026 it stops for good. Remotes that use HTTPS are not affected.&lt;/p&gt;
&lt;p&gt;Plexus now recognises SSH remotes on &lt;code&gt;ssh.bitbucket.org&lt;/code&gt; as Bitbucket. Pull requests, CI status, &lt;strong&gt;Open on Bitbucket&lt;/strong&gt; and cross-device sync keep working after you switch a project over, and a project you have switched still matches the same project on a machine that hasn&apos;t switched yet. SSH remotes on &lt;code&gt;altssh.bitbucket.org&lt;/code&gt; and GitHub&apos;s &lt;code&gt;ssh.github.com&lt;/code&gt; are recognised too.&lt;/p&gt;
&lt;h3 id=&quot;updating-your-projects&quot;&gt;Updating your projects&lt;/h3&gt;
&lt;p&gt;When a project still has an SSH remote on &lt;code&gt;bitbucket.org&lt;/code&gt;, Plexus shows a notice: &lt;strong&gt;Bitbucket is moving SSH to ssh.bitbucket.org&lt;/strong&gt;, with &lt;strong&gt;Review&lt;/strong&gt; and &lt;strong&gt;Not now&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Review&lt;/strong&gt; lists each remote that needs to change, with its current address and its new one. A checkbox, ticked by default, also adds Bitbucket&apos;s published host keys for &lt;code&gt;ssh.bitbucket.org&lt;/code&gt; to your &lt;code&gt;known_hosts&lt;/code&gt; file. Without them, ssh stops to ask whether you trust the new host the first time it connects, and Plexus&apos;s background fetches and the commands your agents run have no way to answer. Nothing is changed until you click &lt;strong&gt;Update&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not now&lt;/strong&gt; puts the notice away. It comes back the next time you open Plexus, for as long as a project still uses the old address.&lt;/p&gt;
&lt;p&gt;Plexus never edits your &lt;code&gt;~/.ssh/config&lt;/code&gt;. If the old address comes from there, through a &lt;code&gt;Host&lt;/code&gt; alias, or from a git &lt;code&gt;insteadOf&lt;/code&gt; rule, or if a &lt;code&gt;Host bitbucket.org&lt;/code&gt; block picks your key, the dialog shows you the exact line to change instead. If your SSH config already sends &lt;code&gt;bitbucket.org&lt;/code&gt; to &lt;code&gt;ssh.bitbucket.org&lt;/code&gt;, Plexus leaves those remotes alone.&lt;/p&gt;
&lt;p&gt;From 12 November, if a fetch or push fails because a remote still uses the old address, the error tells you that Bitbucket is phasing out SSH on &lt;code&gt;bitbucket.org&lt;/code&gt; and how to fix the remote.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v1.3.0 — The Stack map</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v1.3.0"/>
    <id>https://runplexus.com/changelog#v1.3.0</id>
    <published>2026-10-19T00:00:00Z</published>
    <updated>2026-10-19T00:00:00Z</updated>
    <summary>Stacks get a new home. Every session now shows its state as a small chip, a stacked session gets a Stack panel that draws the whole stack as a map with a merge button underneath, and a stack on GitHub becomes one of GitHub&apos;s own stacked pull requests. Syncing now works around your uncommitted changes, conflicts go to the session&apos;s own agent, and there are no more Retry buttons.</summary>
    <content type="html">&lt;p&gt;Stacks get a new home. Every session now shows its state as a small chip, a stacked session gets a Stack panel that draws the whole stack as a map with a merge button underneath, and a stack on GitHub becomes one of GitHub&apos;s own stacked pull requests. Syncing now works around your uncommitted changes, conflicts go to the session&apos;s own agent, and there are no more Retry buttons.&lt;/p&gt;
&lt;h2 id=&quot;the-stack-map&quot;&gt;The Stack map&lt;/h2&gt;
&lt;p&gt;A stacked session&apos;s context bar now has a &lt;strong&gt;Stack pill&lt;/strong&gt;, such as &lt;strong&gt;Stack 2 of 3&lt;/strong&gt;. Click it to open the &lt;strong&gt;Stack panel&lt;/strong&gt; beside the session. The panel draws the stack from top to bottom, with your base branch at the bottom. For each layer it shows the pull request&apos;s number and title, the session&apos;s name and its state, plus three facts: the checks, the review and whether the branch is synced. The layer you have open is highlighted. If it needs you, a banner says why and gives you the one thing to do about it.&lt;/p&gt;
&lt;p&gt;A session that isn&apos;t stacked but has an open pull request gets a pill with the PR number. It opens the same panel for that one pull request.&lt;/p&gt;
&lt;h3 id=&quot;moving-between-layers&quot;&gt;Moving between layers&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;⌥↑&lt;/code&gt; and &lt;code&gt;⌥↓&lt;/code&gt; (Alt+↑ and Alt+↓ on Windows and Linux) open the session one layer up or down the stack, with its panel. They work even while the agent terminal has focus, and you can rebind them under &lt;strong&gt;Settings → Shortcuts&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In a narrow window the panel opens over the session instead of beside it. In a split view, each pane has its own panel.&lt;/p&gt;
&lt;h2 id=&quot;merging-a-stack&quot;&gt;Merging a stack&lt;/h2&gt;
&lt;p&gt;The merge button at the foot of the Stack panel merges the layer you have open and everything below it. Its label tells you how far it goes: &lt;strong&gt;Merge&lt;/strong&gt; on the bottom layer, &lt;strong&gt;Merge 2&lt;/strong&gt; on the second and &lt;strong&gt;Merge stack&lt;/strong&gt; on the top. &lt;strong&gt;Merge up to here&lt;/strong&gt; in a stacked session&apos;s ⋯ menu does the same thing. Until every layer it would merge is ready, the button is disabled and names what it is waiting for, such as &lt;em&gt;Waiting for checks on #128&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Every merge asks once. A short confirmation lists the pull requests, the branch they go into, whether GitHub merges them together or Plexus merges them one at a time, whether the branch requires a merge queue, what moves next, and the merge method. While the merge runs, the rows read &lt;strong&gt;Merging&lt;/strong&gt; and the panel shows its progress with a &lt;strong&gt;Pause&lt;/strong&gt; button. A progress strip in the context bar, &lt;em&gt;GitHub is merging 2&lt;/em&gt; or &lt;em&gt;Merging 1 of 3&lt;/em&gt;, keeps it in view from any session of the project. When it&apos;s done, one notification says what merged.&lt;/p&gt;
&lt;p&gt;This replaces &lt;strong&gt;Land stack…&lt;/strong&gt; and the &lt;strong&gt;Land queue&lt;/strong&gt; panel on the project dashboard.&lt;/p&gt;
&lt;h2 id=&quot;a-state-on-every-row&quot;&gt;A state on every row&lt;/h2&gt;
&lt;p&gt;Every session now shows its state as a chip in the sidebar, on both dashboards, in split-view panes and in the context bar. The states are &lt;strong&gt;Behind&lt;/strong&gt;, &lt;strong&gt;Syncing&lt;/strong&gt;, &lt;strong&gt;Waiting for agent&lt;/strong&gt;, &lt;strong&gt;Agent resolving&lt;/strong&gt;, &lt;strong&gt;Checks running&lt;/strong&gt;, &lt;strong&gt;Needs review&lt;/strong&gt;, &lt;strong&gt;Ready to merge&lt;/strong&gt;, &lt;strong&gt;Merging&lt;/strong&gt;, &lt;strong&gt;In merge queue&lt;/strong&gt; and &lt;strong&gt;Merged&lt;/strong&gt;. When something is stuck, an amber &lt;strong&gt;Needs you&lt;/strong&gt; chip gives the reason. A session with nothing to report shows no chip.&lt;/p&gt;
&lt;p&gt;Each &lt;strong&gt;Needs you&lt;/strong&gt; state comes with one action, such as &lt;strong&gt;Resolve with agent&lt;/strong&gt;, &lt;strong&gt;Ask agent to commit&lt;/strong&gt;, &lt;strong&gt;Open checks&lt;/strong&gt;, &lt;strong&gt;Open on Bitbucket&lt;/strong&gt; or &lt;strong&gt;Sync now&lt;/strong&gt;. You&apos;ll find it on the chip, and as a button in the context bar. The sidebar&apos;s &lt;strong&gt;need you&lt;/strong&gt; count includes these, and counts each session once.&lt;/p&gt;
&lt;h2 id=&quot;no-more-retry&quot;&gt;No more Retry&lt;/h2&gt;
&lt;p&gt;When a sync or a merge stops on something that needs you, fixing the cause is enough. Once the checks pass, the conflict is resolved, the pull request is reopened or the agent has finished, Plexus notices and carries on by itself. A merge that stopped on a closed pull request waits until it is reopened or taken out.&lt;/p&gt;
&lt;p&gt;Notifications are fewer, too. You get one when something needs you and you aren&apos;t looking at that session, when Bitbucket needs you to add a pull request to its merge queue, when a merge finishes, and when an error needs you. Everything else now shows on the row itself.&lt;/p&gt;
&lt;h2 id=&quot;stack-on&quot;&gt;Stack on…&lt;/h2&gt;
&lt;p&gt;You can now stack a session that already exists. Choose &lt;strong&gt;Stack on…&lt;/strong&gt; in its ⋯ menu and pick the session it should sit on. The picker explains what will happen: the session syncs onto the one you pick, and its pull request will target that session&apos;s branch. It only lists sessions it can actually be stacked on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New session on top…&lt;/strong&gt; is now called &lt;strong&gt;New stacked session…&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;stacks-on-github&quot;&gt;Stacks on GitHub&lt;/h2&gt;
&lt;p&gt;On GitHub, a stack&apos;s open pull requests now become one of GitHub&apos;s own stacked pull requests. This happens automatically when there are two or more of them, one on top of the other. GitHub then shows the stack itself, and the Stack panel&apos;s header reads &lt;strong&gt;GitHub stack&lt;/strong&gt;. Where GitHub shows the stack, Plexus leaves its own stack list out of the pull request descriptions. A stack of yours that branches usually isn&apos;t grouped, because GitHub&apos;s stacks are a straight line, so the description list still covers it.&lt;/p&gt;
&lt;p&gt;Merging from a GitHub stack takes one step: GitHub merges the pull requests you chose together, through its merge queue when the branch requires one, and retargets the rest itself. If you stacked pull requests on GitHub yourself and each one belongs to a session in the project, Plexus nests those sessions to match.&lt;/p&gt;
&lt;p&gt;You can turn this off with &lt;strong&gt;Create stacks on GitHub&lt;/strong&gt; under &lt;strong&gt;Settings → Git ▸ Stacks&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;bitbuckets-merge-queue&quot;&gt;Bitbucket&apos;s merge queue&lt;/h2&gt;
&lt;p&gt;When a Bitbucket branch requires its merge queue, Plexus now goes through the queue and never merges past it. Bitbucket doesn&apos;t let other apps add to the queue, so that one click is yours. The row reads &lt;strong&gt;Needs you: add to merge queue&lt;/strong&gt;, names the queue (and says if it is paused), and offers &lt;strong&gt;Open on Bitbucket&lt;/strong&gt;. Once Bitbucket reports the pull request queued, the row reads &lt;strong&gt;In queue&lt;/strong&gt;, then &lt;strong&gt;Merged&lt;/strong&gt;, and merging carries on.&lt;/p&gt;
&lt;p&gt;If other sessions are stacked on that pull request, Plexus first asks Bitbucket to keep its branch after the merge. That way the pull requests above it can move onto your main branch before the branch is deleted.&lt;/p&gt;
&lt;h2 id=&quot;syncing-around-your-work&quot;&gt;Syncing around your work&lt;/h2&gt;
&lt;p&gt;Restacking is now called &lt;strong&gt;syncing&lt;/strong&gt;, and it no longer stops for uncommitted changes. Plexus syncs around them and leaves your uncommitted files exactly as they are. It only stops if your edits touch a file the sync has to change. Then nothing is changed and, by default, the session&apos;s agent is asked to commit or stash its work so the sync can run.&lt;/p&gt;
&lt;p&gt;When a sync conflicts, Plexus undoes it and, by default, hands the conflict to the session&apos;s own agent. The hand-off now always arrives: if the agent is in the middle of a turn, it gets the conflict when the turn ends. Each conflict is handed over once. If the agent can&apos;t resolve it, the row says so rather than asking again.&lt;/p&gt;
&lt;p&gt;A sync that you or the agent finished by hand is now recorded and pushed. After that, the next sync no longer replays commits the parent session has since rewritten. A push that failed is tried again. When GitHub has already rebased a branch the same way, Plexus takes GitHub&apos;s version instead of stopping on a refused push.&lt;/p&gt;
&lt;h2 id=&quot;merge-in-order&quot;&gt;Merge in order&lt;/h2&gt;
&lt;p&gt;The land queue for pull requests that don&apos;t depend on each other is now &lt;strong&gt;Merge in order&lt;/strong&gt;. Choose &lt;strong&gt;Add to Merge in order&lt;/strong&gt; in a session&apos;s ⋯ menu, open any of those sessions to see the numbered list in its Stack panel, drag rows into the order you want and click &lt;strong&gt;Merge 3&lt;/strong&gt;. Plexus merges them one after another, syncing the next one onto your main branch when it needs it and waiting for its checks. If anything needs you, it waits and carries on once it&apos;s fixed. The list only merges when you click its own merge button, and on the dashboards each of its rows shows its place, such as &lt;strong&gt;1 of 3&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;stacks-settings&quot;&gt;Stacks settings&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;Stacked PRs&lt;/strong&gt; settings are now called &lt;strong&gt;Stacks&lt;/strong&gt;, under &lt;strong&gt;Settings → Git ▸ Stacks&lt;/strong&gt;. They use the new words, such as &lt;strong&gt;Sync stacked sessions&lt;/strong&gt; and &lt;strong&gt;Push after syncing&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;When a sync conflicts&lt;/strong&gt; replaces the two conflict settings, one for restacking and one for landing. It covers conflicts both while syncing and while merging, and defaults to &lt;strong&gt;Hand it to the session&apos;s agent&lt;/strong&gt;. For conflicts while merging that is a change, because the landing setting used to ask first. If you had set either old setting to stop, or the landing one to ask first, updating keeps your choice.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Create stacks on GitHub&lt;/strong&gt; is new, and on by default.&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;stacks-ordered-merging&quot;&gt;Stacks &amp;amp; ordered merging&lt;/h2&gt;
&lt;p&gt;What a plan called &lt;strong&gt;stacked pull requests with a land queue&lt;/strong&gt; is now called &lt;strong&gt;Stacks &amp;amp; ordered merging&lt;/strong&gt;. It is still the same part of a plan, and it is still one of the seven things a plan unlocks. Everything in this release that links, syncs or merges for you is part of it: &lt;strong&gt;Stack on…&lt;/strong&gt;, GitHub stacks, the merge buttons, &lt;strong&gt;Merge in order&lt;/strong&gt;, &lt;strong&gt;Sync now&lt;/strong&gt;, &lt;strong&gt;Resolve with agent&lt;/strong&gt; and &lt;strong&gt;Ask agent to commit&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nothing that worked without a plan has moved behind one. The state chips, the Stack pill and the Stack panel&apos;s map are free for everyone, as are &lt;strong&gt;Unstack&lt;/strong&gt;, &lt;strong&gt;Remove from Merge in order&lt;/strong&gt; and every action that only opens something.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v1.2.1 — Status that keeps up with Claude Code</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v1.2.1"/>
    <id>https://runplexus.com/changelog#v1.2.1</id>
    <published>2026-10-16T00:00:00Z</published>
    <updated>2026-10-16T00:00:00Z</updated>
    <summary>The activity dot and the blue ring now keep up with how Claude Code works today: workflows stay on the ring until they finish, the dot follows Esc and approved prompts by itself, and only the prompts that need you turn it amber.</summary>
    <content type="html">&lt;p&gt;The activity dot and the blue ring now keep up with how Claude Code works today: workflows stay on the ring until they finish, the dot follows Esc and approved prompts by itself, and only the prompts that need you turn it amber.&lt;/p&gt;
&lt;h2 id=&quot;workflows-keep-the-ring-lit-until-they-finish&quot;&gt;Workflows keep the ring lit until they finish&lt;/h2&gt;
&lt;p&gt;A Claude Code workflow now lights the blue ring for its whole run, through the gaps between its phases, and counts as one item. Before, the ring went dark a few seconds after a workflow started, and a session could tell you it needed your input while the workflow was still running. Now the session stays quiet until the workflow, and any other delegated work, has finished, and then tells you once.&lt;/p&gt;
&lt;p&gt;Hover the dot to see what is running, for example &amp;quot;Waiting for input — 1 workflow (4 agents), 2 subagents running · 1 background shell&amp;quot;. A workflow is listed once, with the number of its agents that are still running.&lt;/p&gt;
&lt;p&gt;The ring now covers the same work Claude Code itself counts as keeping a session busy: background subagents, workflows, agent-team teammates and cloud sessions. Claude Code now runs subagents in the background by default, so you will see the ring more often than before. Background shell commands and monitors don&apos;t light the ring, because a dev server left running would keep it lit for hours, but the tooltip still mentions them. The delegating counts on a collapsed project, in the workspace switcher and on the dashboards now count background tasks, and a workflow counts once.&lt;/p&gt;
&lt;h2 id=&quot;the-dot-follows-esc-and-approved-prompts&quot;&gt;The dot follows Esc and approved prompts&lt;/h2&gt;
&lt;p&gt;Press &lt;code&gt;Esc&lt;/code&gt; to interrupt a turn and the dot turns amber within a few seconds. Before, it stayed green until your next prompt. Approve a permission prompt and the dot goes back to green while the agent carries on, instead of staying amber until the turn ends.&lt;/p&gt;
&lt;p&gt;Plexus now also checks the dot against Claude Code&apos;s own record of what each session is doing, and corrects it when the two disagree. Hooks are still the instant signal, and that record never overrides a hook that reported something more recently. With older versions of Claude Code, Plexus picks up the same two moments from the session&apos;s conversation instead.&lt;/p&gt;
&lt;p&gt;Forking a conversation with &lt;code&gt;/fork&lt;/code&gt; or &lt;code&gt;/branch&lt;/code&gt; no longer stops the dot from updating.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check activity hooks…&lt;/strong&gt; in a session&apos;s ⋯ menu now shows more: what Claude Code&apos;s own record says about the session and how recently it was updated, what last moved the dot and why, and what is running in the background, by kind.&lt;/p&gt;
&lt;h2 id=&quot;only-prompts-that-need-you-turn-the-dot-amber&quot;&gt;Only prompts that need you turn the dot amber&lt;/h2&gt;
&lt;p&gt;Claude Code sends some notifications only to keep you informed, for example when a background agent finishes, when a sign-in succeeds, or about a usage limit. These no longer turn a working session to Needs you, and no longer alert you. Permission prompts, Claude Code&apos;s reminder that it is waiting for your input, and questions from a tool still turn the dot amber, as before.&lt;/p&gt;
&lt;h2 id=&quot;one-plexus-per-data-folder&quot;&gt;One Plexus per data folder&lt;/h2&gt;
&lt;p&gt;If you open Plexus while it is already running, the second copy now tells you Plexus is already running and closes. Before, it started anyway and marked the sessions running in the first copy as stopped, even though their agents were still running. Restarting Plexus to install an update still works: the new copy waits a few seconds for the old one to close.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v1.2.0 — Plnnrly in the Toolchain</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v1.2.0"/>
    <id>https://runplexus.com/changelog#v1.2.0</id>
    <published>2026-10-15T00:00:00Z</published>
    <updated>2026-10-15T00:00:00Z</updated>
    <summary>A Plnnrly project can now sit in your Toolchain next to your code: its backlog, its board and its sprints in a tab, and any work item a click away from a session that is linked to it.</summary>
    <content type="html">&lt;p&gt;A Plnnrly project can now sit in your Toolchain next to your code: its backlog, its board and its sprints in a tab, and any work item a click away from a session that is linked to it.&lt;/p&gt;
&lt;h2 id=&quot;plnnrly-in-the-toolchain&quot;&gt;Plnnrly in the Toolchain&lt;/h2&gt;
&lt;p&gt;If your team plans its work in Plnnrly, a Plnnrly project can now be worked inside Plexus the way a GitHub repository&apos;s issues can — its backlog, its board, its sprints and every work item in it — and any work item can start a session that stays linked to it. Everything goes from your machine straight to your own Plnnrly organization; nothing about it passes through us.&lt;/p&gt;
&lt;h3 id=&quot;connect-your-organization&quot;&gt;Connect your organization&lt;/h3&gt;
&lt;p&gt;A new &lt;strong&gt;Integrations&lt;/strong&gt; page in Settings holds your connections to services that are not git hosts. Under &lt;strong&gt;Plnnrly&lt;/strong&gt;, choose &lt;strong&gt;Add Plnnrly organization&lt;/strong&gt;, type the organization&apos;s address — its name, its plnnrly.com address or its own domain — and press &lt;strong&gt;Continue&lt;/strong&gt;. Then &lt;strong&gt;Sign in with Plnnrly&lt;/strong&gt; in your browser — the only way to connect, so there is no token to create, paste or rotate. Connecting needs a Plnnrly role that may manage API tokens, the same as creating one. Connect as many organizations as you work in; each row has &lt;strong&gt;Reconnect&lt;/strong&gt; and &lt;strong&gt;Disconnect&lt;/strong&gt;, and every sign-in is kept in your operating system&apos;s keychain.&lt;/p&gt;
&lt;h3 id=&quot;a-plnnrly-tab&quot;&gt;A Plnnrly tab&lt;/h3&gt;
&lt;p&gt;On the Toolchain, a new &lt;strong&gt;Work management&lt;/strong&gt; section has a &lt;strong&gt;Plnnrly&lt;/strong&gt; card: pick the organization and the project, press &lt;strong&gt;Attach&lt;/strong&gt;, and a &lt;strong&gt;Plnnrly · project&lt;/strong&gt; tab appears on the strip. It has the views Plnnrly has — &lt;strong&gt;Backlog&lt;/strong&gt;, &lt;strong&gt;Active sprint&lt;/strong&gt; and &lt;strong&gt;All work&lt;/strong&gt; for a project that runs in sprints, &lt;strong&gt;Board&lt;/strong&gt; and &lt;strong&gt;All work&lt;/strong&gt; for one that doesn&apos;t — with a search and filters for status, assignee, label, priority and type, and &lt;strong&gt;New work item&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Open a work item to change its title, description, fields and status, and to comment. The status menu offers only the moves the project&apos;s workflow allows, and the board does the same: drag a card to a column the workflow doesn&apos;t allow and it snaps back and says why. Descriptions keep their formatting and their mentions when you edit them. Reordering cards within a column works where your Plnnrly organization supports it. In a sprints project you can &lt;strong&gt;Start sprint&lt;/strong&gt;, &lt;strong&gt;Complete sprint&lt;/strong&gt; — choosing where the unfinished work goes — and move work items between sprints and the backlog.&lt;/p&gt;
&lt;h3 id=&quot;start-a-session-from-a-work-item&quot;&gt;Start a session from a work item&lt;/h3&gt;
&lt;p&gt;Every work item has &lt;strong&gt;Start session&lt;/strong&gt;. The session is named after it — &lt;code&gt;OPTH-186 The work item&apos;s title&lt;/code&gt; — so its branch is too, the agent can be handed the work item as its first prompt, and the session carries a &lt;strong&gt;Work item&lt;/strong&gt; sidebar with the item beside the agent, editable, exactly like a GitHub issue&apos;s.&lt;/p&gt;
&lt;h3 id=&quot;part-of-your-issue-tracker-in-plexus&quot;&gt;Part of your issue tracker in Plexus&lt;/h3&gt;
&lt;p&gt;The Plnnrly tab and its sidebar are part of &lt;strong&gt;your issue tracker inside Plexus&lt;/strong&gt; — the sixth thing a plan unlocks, not a seventh — and need the same plan or seat as the Issues tab. Connecting an organization, attaching a project and the link a session carries are free.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v1.1.0 — New windows and split view</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v1.1.0"/>
    <id>https://runplexus.com/changelog#v1.1.0</id>
    <published>2026-10-15T00:00:00Z</published>
    <updated>2026-10-15T00:00:00Z</updated>
    <summary>Plexus is no longer one window, and no longer one session at a time. Put an agent on your second monitor, keep a dev server&apos;s terminal beside your editor, or put several sessions side by side in a split view and watch them all work.</summary>
    <content type="html">&lt;p&gt;Plexus is no longer one window, and no longer one session at a time. Put an agent on your second monitor, keep a dev server&apos;s terminal beside your editor, or put several sessions side by side in a split view and watch them all work.&lt;/p&gt;
&lt;h2 id=&quot;open-in-new-window&quot;&gt;Open in new window&lt;/h2&gt;
&lt;p&gt;A session, a project, a single terminal or the dashboard can now open in a window of its own. A session&apos;s window holds the whole session: the agent, the Review, Explorer and Git tabs, and its terminals. A project&apos;s window holds the project view, with its dashboard, Git client and terminals. These windows are kept plain, with just the session or project name along the top and the view below it (a terminal&apos;s window shows the terminal and where it belongs), because the main window already has the sidebar.&lt;/p&gt;
&lt;p&gt;There are several ways to open one:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;The window button in a session&apos;s or project&apos;s header, next to the close button.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Open in new window&lt;/strong&gt; in a session&apos;s or project&apos;s ⋯ menu, in the sidebar or on a dashboard row.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Ctrl+Shift+N&lt;/code&gt; (&lt;code&gt;Cmd+Shift+N&lt;/code&gt; on macOS) with a session or project selected. You can rebind it under &lt;strong&gt;Settings → Shortcuts&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;In &lt;code&gt;Ctrl+K&lt;/code&gt; search, &lt;code&gt;Ctrl+Enter&lt;/code&gt; (&lt;code&gt;Cmd&lt;/code&gt; on macOS) opens the highlighted session or project in a new window instead of the main one.&lt;/li&gt;&lt;li&gt;Right-click a terminal&apos;s tab and choose &lt;strong&gt;Open in new window&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Open dashboard in new window&lt;/strong&gt; in the dashboard&apos;s header.&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;it-moves-it-doesnt-copy&quot;&gt;It moves, it doesn&apos;t copy&lt;/h3&gt;
&lt;p&gt;A session, project or terminal you open in a new window moves there, so the same terminal is never open in two places at once. In the main window its row shows a small window icon, and selecting it brings its window to the front. If the main window was showing it, it now offers &lt;strong&gt;Focus window&lt;/strong&gt; and &lt;strong&gt;Bring back here&lt;/strong&gt;. The dashboard is the exception: its window is a second live copy, and clicking a session in it opens that session in the main window.&lt;/p&gt;
&lt;p&gt;The agent and your terminals keep running while they move, and they keep their recent scrollback.&lt;/p&gt;
&lt;h3 id=&quot;closing-windows&quot;&gt;Closing windows&lt;/h3&gt;
&lt;p&gt;Closing one of these windows brings what was in it back to the main window, still running. Closing the main window quits Plexus as it always has, and closes the other windows with it.&lt;/p&gt;
&lt;p&gt;When you restart Plexus, your session, project and dashboard windows reopen where you left them. Terminal windows don&apos;t, because terminals end when Plexus quits.&lt;/p&gt;
&lt;h3 id=&quot;good-to-know&quot;&gt;Good to know&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;A session can&apos;t move while a review cycle, an AI review or an AI summary is running for it, while a git operation on it is in progress, while the Explorer has unsaved changes, or while it is still starting. The menu item says which.&lt;/li&gt;&lt;li&gt;Closing a session&apos;s window while one of those jobs is running in it cancels the job, so Plexus asks first.&lt;/li&gt;&lt;li&gt;Notifications and sounds still come once, however many windows you have open.&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;split-view&quot;&gt;Split view&lt;/h2&gt;
&lt;p&gt;Put up to six sessions of the same project side by side. Each pane is a full session, with its own Agent, Review, Explorer and Git tabs and its own terminals, under a slim header with the session&apos;s name and status.&lt;/p&gt;
&lt;p&gt;To make one, open a session&apos;s ⋯ menu and choose &lt;strong&gt;Add to split view ▸ New split view…&lt;/strong&gt;, or choose &lt;strong&gt;New split view…&lt;/strong&gt; in a project&apos;s ⋯ menu. Name it and tick the sessions you want. The same menu adds a session to a split view you already have.&lt;/p&gt;
&lt;h3 id=&quot;in-the-sidebar&quot;&gt;In the sidebar&lt;/h3&gt;
&lt;p&gt;A split view gets its own row in the project&apos;s session list, with its sessions listed under it. The row shows one dot per pane and takes the colour of the pane that most needs you, so a collapsed split view with an agent waiting on you still says so. Click the row to open the split view. Selecting any of its sessions, from the sidebar, search or a notification, opens it with that pane focused.&lt;/p&gt;
&lt;h3 id=&quot;working-in-panes&quot;&gt;Working in panes&lt;/h3&gt;
&lt;p&gt;Click a pane to focus it. The focused pane is the one the top bar and your shortcuts act on. Every agent keeps running whether its pane is on screen or not.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Maximize pane&lt;/strong&gt; in a pane&apos;s header fills the split view with it, and &lt;strong&gt;Restore pane&lt;/strong&gt; brings the others back.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Layout&lt;/strong&gt; in the split view row&apos;s ⋯ menu arranges the panes: &lt;strong&gt;Auto&lt;/strong&gt;, &lt;strong&gt;Columns&lt;/strong&gt;, &lt;strong&gt;Rows&lt;/strong&gt; or &lt;strong&gt;Main + stack&lt;/strong&gt;. Drag the dividers to resize them.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Ctrl+Shift+]&lt;/code&gt; and &lt;code&gt;Ctrl+Shift+[&lt;/code&gt; (&lt;code&gt;Cmd&lt;/code&gt; on macOS) move to the next or previous pane, and &lt;code&gt;Ctrl+Shift+Enter&lt;/code&gt; maximizes or restores the focused one. All three can be rebound under &lt;strong&gt;Settings → Shortcuts&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;The layout, the pane sizes and the focused and maximized panes all come back after a restart.&lt;/p&gt;
&lt;h3 id=&quot;good-to-know-1&quot;&gt;Good to know&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;A session is in one split view at a time. The × in a pane&apos;s header takes it out again, and &lt;strong&gt;Dissolve split view&lt;/strong&gt; turns all its sessions back into ordinary rows. Nothing is stopped or deleted either way.&lt;/li&gt;&lt;li&gt;Archiving or deleting a session takes it out of its split view. A restored session comes back as an ordinary row.&lt;/li&gt;&lt;li&gt;A pane&apos;s session can still open in a window of its own; its pane then offers &lt;strong&gt;Focus window&lt;/strong&gt; and &lt;strong&gt;Bring back here&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Split views stay on this computer and are not synced.&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;resolve-landing-conflicts-with-ai&quot;&gt;Resolve landing conflicts with AI&lt;/h2&gt;
&lt;p&gt;A land queue on Bitbucket no longer stops on &amp;quot;You can&apos;t merge until you resolve all merge conflicts&amp;quot;. This usually happened when several independent pull requests were queued: the first one landed on your main branch, and the next one then conflicted with it. Bitbucket doesn&apos;t report a conflict until you try to merge, so Plexus now checks with git on your machine before it merges. If your provider refuses a merge because of conflicts, Plexus handles it the same way.&lt;/p&gt;
&lt;p&gt;When the next pull request conflicts, Plexus restacks it onto its base. If the restack conflicts, Plexus puts the branch back as it was and, by default, pauses landing on that pull request. Its row in the &lt;strong&gt;Land queue&lt;/strong&gt; panel lists the conflicting files and offers &lt;strong&gt;Resolve with AI&lt;/strong&gt; and &lt;strong&gt;Open terminal&lt;/strong&gt;, and the toast that tells you landing paused has &lt;strong&gt;Resolve with AI&lt;/strong&gt; too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Resolve with AI&lt;/strong&gt; hands the conflict to that session&apos;s own agent, in its terminal, so you can watch it work. The agent is given the exact rebase command and the conflicting files, and is asked not to push. Once it has finished the rebase, Plexus pushes the branch with a lease, waits for its checks and merges it, then carries on with the queue. Each conflict goes to the agent once: an agent that gives up pauses the queue and says so, rather than being asked again and again.&lt;/p&gt;
&lt;p&gt;A new setting, &lt;strong&gt;When landing hits a conflict&lt;/strong&gt; in &lt;strong&gt;Settings → Git ▸ Stacked PRs&lt;/strong&gt;, decides what happens next:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Ask me before the agent resolves it&lt;/strong&gt; (the default)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Resolve it with the session&apos;s agent and keep landing&lt;/strong&gt;, without asking&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Stop and let me resolve it&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;A branch you checked out from an existing branch is never rebased by landing; it still pauses and asks you to restack it yourself. A pull request that is only behind its base, with no conflict, is merged as it is. Plexus doesn&apos;t restack it, so the rest of your queue isn&apos;t force-pushed and doesn&apos;t run its checks again.&lt;/p&gt;
&lt;h2 id=&quot;coming-back-from-a-payment&quot;&gt;Coming back from a payment&lt;/h2&gt;
&lt;p&gt;When you finish paying for a plan and the invoicing provider sends you back to the &lt;strong&gt;Billing&lt;/strong&gt; page on the account panel, the page now checks the plan straight away and tells you where it stands: &lt;strong&gt;Payment received — your plan is active&lt;/strong&gt;, or that the payment is in but the provider has not confirmed it yet, which usually takes under a minute. Press &lt;strong&gt;Refresh&lt;/strong&gt; to see the plan once it has.&lt;/p&gt;
&lt;p&gt;If what you just bought was seats for an organization, you now land on that organization&apos;s &lt;strong&gt;Billing&lt;/strong&gt; page instead of your personal one, with the same message.&lt;/p&gt;
&lt;h2 id=&quot;diffs-beside-the-file-list&quot;&gt;Diffs beside the file list&lt;/h2&gt;
&lt;p&gt;In a project&apos;s Git tab, clicking a file now opens its diff where the commit graph was, to the left of the file list, instead of on top of it. The list stays where it is and you can keep using it while you read: click another file and the diff switches to it, or stage and unstage files without closing anything. The &lt;strong&gt;✕&lt;/strong&gt;, the &lt;strong&gt;Uncommitted&lt;/strong&gt; or commit sha at the start of the diff&apos;s header, and &lt;strong&gt;Escape&lt;/strong&gt; close the diff and bring the graph back.&lt;/p&gt;
&lt;p&gt;This works for every file list in the tab: uncommitted changes, a commit&apos;s or a stash&apos;s files, a comparison, a file&apos;s history and blame. In a narrow window, where a diff beside the list would be too cramped to read, the diff still opens over the list as before.&lt;/p&gt;
&lt;h3 id=&quot;selecting-several-files&quot;&gt;Selecting several files&lt;/h3&gt;
&lt;p&gt;In the uncommitted changes, a plain click opens that file&apos;s diff. &lt;strong&gt;Ctrl-click&lt;/strong&gt; (&lt;strong&gt;Cmd-click&lt;/strong&gt; on macOS) or &lt;strong&gt;Shift-click&lt;/strong&gt; to select several files, and the diff closes so you can see the graph again while your files stay selected. Deselect back down to one file and its diff opens again.&lt;/p&gt;
&lt;p&gt;With files selected, the header now has a &lt;strong&gt;Stage&lt;/strong&gt; and an &lt;strong&gt;Unstage&lt;/strong&gt; button next to &lt;strong&gt;Discard&lt;/strong&gt;, each showing how many files it will move. Right-click a file inside the selection for &lt;strong&gt;Stage N files&lt;/strong&gt;, &lt;strong&gt;Unstage N files&lt;/strong&gt; and &lt;strong&gt;Discard N files…&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;drag-and-drop-on-windows&quot;&gt;Drag and drop on Windows&lt;/h2&gt;
&lt;p&gt;Dragging inside Plexus now works on Windows. Until now, starting a drag there showed a &amp;quot;not allowed&amp;quot; cursor and nothing happened when you let go. That affected:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Dragging a branch or tag onto another in a project&apos;s Git tab to merge, rebase, fast-forward, push or start a pull request.&lt;/li&gt;&lt;li&gt;Reordering sessions and split views in the sidebar, panes inside a split view, and pull requests in the &lt;strong&gt;Land queue&lt;/strong&gt; panel.&lt;/li&gt;&lt;li&gt;Moving cards between columns on a project board.&lt;/li&gt;&lt;li&gt;Dragging a field into a saved prompt, or moving one that is already in it.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Dropping a file from your file manager onto a terminal still pastes its path, as before. A field dragged from a saved prompt&apos;s palette can now only be dropped into that prompt, not into another application.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v1.0.1 — A Git tab that matches your history</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v1.0.1"/>
    <id>https://runplexus.com/changelog#v1.0.1</id>
    <published>2026-10-12T00:00:00Z</published>
    <updated>2026-10-12T00:00:00Z</updated>
    <summary>The project Git tab catches up with the dedicated Git clients: a graph that reads like your history, stashes and worktrees right on it, history you can edit and undo, and your pull requests, submodules and LFS files in one place.</summary>
    <content type="html">&lt;p&gt;The project Git tab catches up with the dedicated Git clients: a graph that reads like your history, stashes and worktrees right on it, history you can edit and undo, and your pull requests, submodules and LFS files in one place.&lt;/p&gt;
&lt;h2 id=&quot;a-graph-that-matches-your-history&quot;&gt;A graph that matches your history&lt;/h2&gt;
&lt;p&gt;The project Git graph now lists commits newest first by date. On a repository where a long-lived branch keeps merging another one, the graph used to spread into dozens of lanes and push your other branches far down the list. Now it stays a few lanes wide, and the branches you worked on recently sit at the top.&lt;/p&gt;
&lt;p&gt;A header runs along the top of the graph with &lt;strong&gt;Branch / Tag&lt;/strong&gt;, &lt;strong&gt;Graph&lt;/strong&gt; and &lt;strong&gt;Commit message&lt;/strong&gt; columns. Drag any column&apos;s edge to resize it, and use the gear to add &lt;strong&gt;Author&lt;/strong&gt;, &lt;strong&gt;Date&lt;/strong&gt; and &lt;strong&gt;SHA&lt;/strong&gt;. Each commit shows the first lines of its description after its subject, and a thin line with a label such as &lt;strong&gt;Yesterday&lt;/strong&gt; or &lt;strong&gt;A month ago&lt;/strong&gt; marks where each stretch of history begins. The target button in the header, or &lt;code&gt;Ctrl+Shift+H&lt;/code&gt; (&lt;code&gt;Cmd+Shift+H&lt;/code&gt; on macOS), jumps to the commit you have checked out.&lt;/p&gt;
&lt;p&gt;The strip along the right edge is now the graph&apos;s only scrollbar. Drag it, click it, or use &lt;strong&gt;Page Up&lt;/strong&gt;, &lt;strong&gt;Page Down&lt;/strong&gt;, &lt;strong&gt;Home&lt;/strong&gt; and &lt;strong&gt;End&lt;/strong&gt;. Double-clicking a commit opens its details, and the parents in a commit&apos;s details are links. A commit, branch or tag menu can open it on GitHub or Bitbucket, a remote branch&apos;s menu can pull it into your branch, and the Pull menu has a &lt;strong&gt;Prune when fetching&lt;/strong&gt; switch.&lt;/p&gt;
&lt;h2 id=&quot;checking-out-a-remote-branch&quot;&gt;Checking out a remote branch&lt;/h2&gt;
&lt;p&gt;Double-clicking a remote branch such as &lt;code&gt;origin/develop&lt;/code&gt; still puts you on your local &lt;code&gt;develop&lt;/code&gt; and brings it up to date. Before, if your local &lt;code&gt;develop&lt;/code&gt; had commits the remote didn&apos;t, Plexus quietly left it where it was and still said it had checked out &lt;code&gt;origin/develop&lt;/code&gt;. Now it stops and asks. You can &lt;strong&gt;reset&lt;/strong&gt; your local branch to the remote, optionally stashing your uncommitted changes first, or &lt;strong&gt;check it out as it is&lt;/strong&gt;, or cancel. The message afterwards says what actually happened, for example &amp;quot;fast-forwarded 4 commits&amp;quot;.&lt;/p&gt;
&lt;p&gt;The same choice is on the branch menus as &lt;strong&gt;Reset to origin/develop…&lt;/strong&gt; and &lt;strong&gt;Reset local develop to this…&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;stashes-and-worktrees-on-the-graph&quot;&gt;Stashes and worktrees on the graph&lt;/h2&gt;
&lt;p&gt;Each stash now appears in the graph directly above the commit it was taken on. Click it to see the files it holds and what changed in each, and to apply, pop or drop it. Stashes can also be renamed now.&lt;/p&gt;
&lt;p&gt;When one of your sessions has uncommitted changes, a &lt;strong&gt;// WIP&lt;/strong&gt; row shows them in the graph above the commit that session&apos;s worktree is on. It names the session and counts the changed files. Click it to open the session.&lt;/p&gt;
&lt;h2 id=&quot;show-or-hide-branches&quot;&gt;Show or hide branches&lt;/h2&gt;
&lt;p&gt;Narrow the graph to the lines you care about. Click the eye next to a branch to hide it, or right-click a branch and choose &lt;strong&gt;Show only this branch&lt;/strong&gt;. The gear in the graph&apos;s header can hide all remote branches, tags or stashes. A strip above the graph says what is hidden, and &lt;strong&gt;Show all&lt;/strong&gt; brings everything back. Plexus remembers this per project.&lt;/p&gt;
&lt;h2 id=&quot;edit-squash-and-reorder-commits&quot;&gt;Edit, squash and reorder commits&lt;/h2&gt;
&lt;p&gt;Right-click a commit and choose &lt;strong&gt;Edit message…&lt;/strong&gt; to change the message of any commit on a branch, not just the last one. &lt;strong&gt;Squash into parent…&lt;/strong&gt; folds a commit into the one before it. Neither one touches your files, so both work while you have uncommitted changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interactive rebase from here…&lt;/strong&gt; opens your branch&apos;s commits from that point up. Drag them into a new order and choose for each one whether to pick, reword, squash, fixup or drop it. Plexus asks before rewriting commits that are already on a remote, and conflicts are handled by the usual conflict banner.&lt;/p&gt;
&lt;h2 id=&quot;undo-and-redo&quot;&gt;Undo and redo&lt;/h2&gt;
&lt;p&gt;The Git tab has &lt;strong&gt;Undo&lt;/strong&gt; and &lt;strong&gt;Redo&lt;/strong&gt; buttons, also on &lt;code&gt;Ctrl+Z&lt;/code&gt; and &lt;code&gt;Ctrl+Shift+Z&lt;/code&gt; (&lt;code&gt;Cmd&lt;/code&gt; on macOS) while you aren&apos;t typing. They work for commits, merges, rebases, resets, checkouts, cherry-picks, reverts, pulls, edited messages, creating, renaming or deleting branches, and creating or deleting tags. Hover a button to see which operation it would undo or redo.&lt;/p&gt;
&lt;p&gt;Undo never rewinds anything it didn&apos;t do. If an agent committed or you ran git in a terminal since, it refuses rather than take that work with it. Fetching, pushing, staging and discarding changes can&apos;t be undone.&lt;/p&gt;
&lt;h2 id=&quot;stage-single-lines&quot;&gt;Stage single lines&lt;/h2&gt;
&lt;p&gt;Select the lines you want in an uncommitted file&apos;s diff, with a click, Shift-click for a range or Ctrl/Cmd-click to add one, then press &lt;strong&gt;Stage N lines&lt;/strong&gt;. You can unstage, or discard, just those lines the same way.&lt;/p&gt;
&lt;h2 id=&quot;compare-history-and-blame&quot;&gt;Compare, history and blame&lt;/h2&gt;
&lt;p&gt;Ctrl/Cmd-click a second commit to compare the two, either directly or from where they split, with the commits each side has and the files that differ. &lt;strong&gt;Compare with current branch&lt;/strong&gt; on a branch or tag menu does the same.&lt;/p&gt;
&lt;p&gt;Right-click a file for &lt;strong&gt;File history&lt;/strong&gt;, which lists every commit that changed it and follows it through renames, or &lt;strong&gt;Blame&lt;/strong&gt;, which shows who last changed each line and when. Click a line&apos;s commit to find it in the graph.&lt;/p&gt;
&lt;h2 id=&quot;pull-requests-submodules-and-lfs&quot;&gt;Pull requests, submodules and LFS&lt;/h2&gt;
&lt;p&gt;With GitHub or Bitbucket connected, the Git tab lists the repository&apos;s open pull requests, with their checks and review state. You can check any of them out, including pull requests from forks. Authors are shown as initials, so the list loads no pictures from the provider.&lt;/p&gt;
&lt;p&gt;Repositories with submodules get a section to see which are out of date and update them. Repositories that use Git LFS get one to download the files you are missing and to lock and unlock files.&lt;/p&gt;
&lt;h2 id=&quot;a-reused-branch-name-no-longer-picks-up-an-old-pull-request&quot;&gt;A reused branch name no longer picks up an old pull request&lt;/h2&gt;
&lt;p&gt;A new session on a branch name you had used before — for a pull request merged and deleted long ago — could pick up that old pull request: the session showed as merged, was renamed to the old pull request&apos;s title, and stopped checking for a new one. Plexus now ignores a pull request that was closed or merged before the session was created, so a reused name starts clean, while an open pull request on the branch still counts. A session that is already showing an old pull request is checked again once after you update and cleared, and the &lt;strong&gt;Refresh PR status&lt;/strong&gt; button in its header does the same at any time; the session keeps the name it was given.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v1.0.0 — Sign in to Plexus, and bring your team</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v1.0.0"/>
    <id>https://runplexus.com/changelog#v1.0.0</id>
    <published>2026-10-12T00:00:00Z</published>
    <updated>2026-10-12T00:00:00Z</updated>
    <summary>Plexus now has an account, and it is completely optional. Sign in and you can create organizations for the people you work with, invite them, manage all of it without leaving the app, and see every machine your account is signed in on. There is also, for the first time, something you can pay us for — an individual plan and a per-seat organization plan — and the seven things a plan unlocks: cross-device sync, which keeps your settings, your workspaces and your projects the same on every machine you sign in on; a prompt library that travels with you the same way; the workspaces an organization shares, set up once and handed to everybody who holds a seat; the settings an organization manages, recommended or enforced on every seat-holder&apos;s machine; the prompts an organization publishes, written once as a numbered revision and handed to every seat-holder&apos;s template list; your issue tracker inside Plexus — a project&apos;s GitHub issues and project boards, read, edited and worked from your own GitHub account, and turned into a session with one click; and stacked pull requests, kept restacked and retargeted as the stack moves and landed in order.</summary>
    <content type="html">&lt;p&gt;Plexus now has an account, and it is completely optional. Sign in and you can create organizations for the people you work with, invite them, manage all of it without leaving the app, and see every machine your account is signed in on. There is also, for the first time, something you can pay us for — an individual plan and a per-seat organization plan — and the seven things a plan unlocks: &lt;strong&gt;cross-device sync&lt;/strong&gt;, which keeps your settings, your workspaces and your projects the same on every machine you sign in on; a &lt;strong&gt;prompt library&lt;/strong&gt; that travels with you the same way; &lt;strong&gt;the workspaces an organization shares&lt;/strong&gt;, set up once and handed to everybody who holds a seat; &lt;strong&gt;the settings an organization manages&lt;/strong&gt;, recommended or enforced on every seat-holder&apos;s machine; &lt;strong&gt;the prompts an organization publishes&lt;/strong&gt;, written once as a numbered revision and handed to every seat-holder&apos;s template list; &lt;strong&gt;your issue tracker inside Plexus&lt;/strong&gt; — a project&apos;s GitHub issues and project boards, read, edited and worked from your own GitHub account, and turned into a session with one click; and &lt;strong&gt;stacked pull requests&lt;/strong&gt;, kept restacked and retargeted as the stack moves and landed in order.&lt;/p&gt;
&lt;p&gt;All of it is optional. Sign out, never sign in at all, or sign in and never buy anything, and Plexus works exactly as it did before: every session, every worktree, every git operation, every agent and every setting behaves the same way on your machine. All seven are &lt;strong&gt;new&lt;/strong&gt; things rather than fences around old ones — nothing you already had moved behind the plan. Your code, your keys and your agents still never leave your computer, sync sends nothing at all until it has shown you the entire list first, and signing in or buying a plan changes nothing about the anonymous usage report or about Feedback. Neither one carries your account, and neither one has anywhere to put a plan.&lt;/p&gt;
&lt;h2 id=&quot;your-plexus-account&quot;&gt;Your Plexus account&lt;/h2&gt;
&lt;p&gt;A new &lt;strong&gt;My account&lt;/strong&gt; page lives in Settings, at the foot of the sidebar with the rest of your account. It is a different thing from the GitHub and Bitbucket connections under Git ▸ Providers: those are accounts you hold at a repository host, this is an account you hold with us.&lt;/p&gt;
&lt;p&gt;Signing in opens your browser, asks you to confirm the machine by name, and hands the app a sign-in that is kept in your operating system&apos;s keychain — never in a file, never in the app&apos;s database. Creating an account, changing your password or your email address, and setting up two-factor authentication all happen on the web, because each of them needs an email you have to go and read.&lt;/p&gt;
&lt;h2 id=&quot;organizations&quot;&gt;Organizations&lt;/h2&gt;
&lt;p&gt;An organization is how you group the people you work with. You can create, rename and delete organizations from &lt;strong&gt;Settings → Organizations&lt;/strong&gt; without leaving Plexus, and the same list is on the web.&lt;/p&gt;
&lt;p&gt;Pick an organization and you see everyone in it under &lt;strong&gt;Plan, seats and people&lt;/strong&gt; — their role, whether they hold a seat, and any invitations still waiting to be answered.&lt;/p&gt;
&lt;h2 id=&quot;inviting-people-to-an-organization&quot;&gt;Inviting people to an organization&lt;/h2&gt;
&lt;p&gt;Invite somebody by email address from &lt;strong&gt;Settings → Organizations&lt;/strong&gt; or from the account panel on the web. You pick their role when you invite them, and you can pick &lt;strong&gt;any role your organization has&lt;/strong&gt; — one of the five it starts with, or one you made yourself — rather than choosing between two fixed ones. Owner is the single exception: handing over ownership stays a separate, deliberate act on an existing member, done from the web panel. A seat is a separate question from a role, and anybody can be given one whatever role they hold. What each role can actually do is now yours to decide — see &lt;em&gt;Roles you define yourself&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;They get an email with a single-use link that expires after two weeks. Until they accept, they sit in the same list as everyone else, marked as invited, and they hold no seat. Accepting or declining happens in the browser, from that link — the person you invited very often has no Plexus account yet, so the link&apos;s whole job is to take them through creating one and bring them back to your invitation.&lt;/p&gt;
&lt;p&gt;Resending an invitation issues a &lt;strong&gt;new&lt;/strong&gt; link and kills the old one. There is no &amp;quot;copy invite link&amp;quot; button, and there cannot be one: the link only ever exists in the email we sent, never in a list, a response or a log.&lt;/p&gt;
&lt;p&gt;Because a second person can now be an owner, deleting your Plexus account is no longer refused just because you own an organization. It is refused only while you are its &lt;strong&gt;only&lt;/strong&gt; owner — promote somebody else first, or delete the organization.&lt;/p&gt;
&lt;h2 id=&quot;roles-you-define-yourself&quot;&gt;Roles you define yourself&lt;/h2&gt;
&lt;p&gt;What somebody may do inside an organization is decided by the &lt;strong&gt;roles&lt;/strong&gt; they hold, and you write those yourself, from the account panel on the web. Every organization starts with five:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Owner&lt;/strong&gt; — everything, including buying a plan and deleting the organization.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Admin&lt;/strong&gt; — everything except those two.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Maintainer&lt;/strong&gt; — a member who also looks after what the organization shares with everybody in it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Member&lt;/strong&gt; — the ordinary role somebody arrives with.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Restricted&lt;/strong&gt; — a member with something deliberately taken away, for contractors and anybody who should be in the organization without being free to act in it.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Those five ship with Plexus and cannot be edited, which is what lets them mean the same thing in your organization as in anybody else&apos;s. To get something else, &lt;strong&gt;copy one, name it, and tick or untick what it can do.&lt;/strong&gt; The copy is an ordinary role of your own — rename it, change it again later, hand it out, delete it — and it takes effect the moment you save it. Nothing about it waits for a release from us.&lt;/p&gt;
&lt;p&gt;Some of the boxes are greyed and marked as planned. The list deliberately names every act a role will ever be able to grant, including ones inside features we are still building, so that a role you think through today does not have to be reconsidered every time we ship something. A greyed box does nothing yet, and it stops being grey in the release that gives it something to do.&lt;/p&gt;
&lt;p&gt;Somebody can hold &lt;strong&gt;more than one role&lt;/strong&gt;, and what they end up able to do is everything their roles allow — except that &lt;strong&gt;taking a permission away always beats granting it.&lt;/strong&gt; That is the rule that makes Restricted reliable rather than advisory: a contractor who holds Restricted &lt;em&gt;and&lt;/em&gt; Member keeps whatever Restricted takes away taken away, instead of quietly getting it back through the other role. Copy Restricted and the copy keeps the takeaway too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The last owner cannot be removed or demoted.&lt;/strong&gt; An organization with nobody left who can pay for it or close it down is one only we could rescue, so both are refused while there is only one owner. Promote somebody else first.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;All of this is free.&lt;/strong&gt; Roles and permissions are not part of a plan and never will be: an organization with no plan at all, and no seats, writes and edits roles exactly like one paying for a hundred. Deciding what a contractor may do is not something that should stop working because an invoice bounced.&lt;/p&gt;
&lt;h3 id=&quot;an-admin-no-longer-buys-plans&quot;&gt;An admin no longer buys plans&lt;/h3&gt;
&lt;p&gt;One thing genuinely changes for organizations that already exist, and it is better read here than discovered on an invoice. &lt;strong&gt;Admin no longer covers billing or deleting the organization.&lt;/strong&gt; An admin cannot buy a plan, change how many seats the organization pays for, read the invoices, or delete the organization — those stay with the owner who signed up for them. Everything else an admin did, they still do: inviting people and removing them, giving out and taking back seats, renaming the organization, and writing the roles.&lt;/p&gt;
&lt;p&gt;If your admins are the people who pay your bills, the fix takes a minute and needs nothing from us: &lt;strong&gt;copy Admin, tick the billing permission back on, and give that role to the people who need it&lt;/strong&gt; in place of Admin. It is Admin with billing added back, so nothing else changes hands in the swap.&lt;/p&gt;
&lt;h2 id=&quot;paid-plans&quot;&gt;Paid plans&lt;/h2&gt;
&lt;p&gt;Plexus now has something you can buy. There are two plans, both monthly, both priced in euro, and both renewing until you cancel:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;an &lt;strong&gt;individual plan&lt;/strong&gt;, held by your own account&lt;/li&gt;&lt;li&gt;an &lt;strong&gt;organization plan&lt;/strong&gt;, sold &lt;strong&gt;per seat&lt;/strong&gt;, held by an organization you own or administer&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Buying opens your browser at our invoicing provider&apos;s checkout page, where the price and &lt;strong&gt;the VAT that applies to you&lt;/strong&gt; are shown before you pay, and where you set up how you pay. Your card, bank account and direct-debit details are given to them on their page and never to us.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Billing&lt;/strong&gt; page on the account panel shows the plan on offer and its current price before you buy anything — the price is read from the invoicing provider&apos;s own product each time the page is drawn, so it is the figure the checkout will use, with VAT added there for your country. Press &lt;strong&gt;Subscribe&lt;/strong&gt; (&lt;strong&gt;Buy seats&lt;/strong&gt; on an organization) and a dialog asks you to tick a box — unticked, never ticked for you — saying you want the plan to start immediately and understand that you give up the 14-day right to withdraw by doing so; without the tick it goes no further. In the app the same box sits beside &lt;strong&gt;Buy a plan&lt;/strong&gt;. The plan starts the moment the purchase completes and there is no trial, so that acknowledgement is the honest version of the transaction rather than a formality.&lt;/p&gt;
&lt;p&gt;Coming back from the checkout, the app re-reads the plan it is showing on its own, and the seven things a plan unlocks follow within seconds: whenever a fresh answer about the plan disagrees with what the app last knew about them, it asks again straight away instead of waiting for its hourly check. There is also a button that asks our invoicing provider for the current state of the plan right now — &lt;strong&gt;Reload&lt;/strong&gt; on the plan in the app, &lt;strong&gt;Refresh&lt;/strong&gt; on the web panel&apos;s Billing page — for the minute after you have changed something on their side and come straight back.&lt;/p&gt;
&lt;p&gt;A cancelled plan reads &lt;strong&gt;Cancelled&lt;/strong&gt; with the day it ends, and nothing else is offered on it: a cancellation cannot be taken back, so there is no second &lt;strong&gt;Cancel plan&lt;/strong&gt; and no &lt;strong&gt;Resume&lt;/strong&gt;. When the period runs out, subscribing again starts a fresh plan.&lt;/p&gt;
&lt;p&gt;What a plan unlocks, as of this release, is cross-device sync, saving a prompt to your library, the workspaces an organization shares with the people who hold a seat, and the settings it manages for them. Everything else in Plexus is the same on both sides of the purchase — see &lt;em&gt;What a plan unlocks, and what it never will&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;seats&quot;&gt;Seats&lt;/h2&gt;
&lt;p&gt;An organization plan pays for a number of &lt;strong&gt;seats&lt;/strong&gt;, and a seat is something you hand to a member. The two are deliberately separate: &lt;strong&gt;an organization can have more members than seats&lt;/strong&gt;, and nothing forces a member to hold one. Give and take back seats from &lt;strong&gt;Settings → Organizations&lt;/strong&gt; with one click each, and the count on screen moves with the list — it is one answer from the server, never two things that can disagree.&lt;/p&gt;
&lt;p&gt;Change how many seats you pay for from the app or the web panel. The invoicing provider works out the difference and raises the correction invoice, because there is exactly one place that decides what anything costs and it is not us. Setting an organization to &lt;strong&gt;zero&lt;/strong&gt; seats is allowed — that is how a team gives its seats up without cancelling. Setting it below the number of seats people are actually holding is refused, and the refusal tells you how many are in use so you know what to take back first.&lt;/p&gt;
&lt;p&gt;Taking somebody out of an organization frees their seat. And to be clear about what a seat now is: it is how a member gets whatever your organization&apos;s plan includes. In this release that is cross-device sync on their own machines, &lt;strong&gt;the workspaces your organization shares&lt;/strong&gt; — the first thing a seat carries &lt;em&gt;inside&lt;/em&gt; the organization rather than only between one person&apos;s own computers — and &lt;strong&gt;the settings it manages&lt;/strong&gt;. &lt;strong&gt;A member without a seat keeps everything Plexus did before, in full&lt;/strong&gt;; what they do not get is the organization&apos;s workspaces and its settings.&lt;/p&gt;
&lt;h2 id=&quot;invoices-and-payment-details&quot;&gt;Invoices and payment details&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Payment method &amp;amp; invoice PDFs&lt;/strong&gt; on the Billing page (&lt;strong&gt;Manage billing&lt;/strong&gt; in the app) opens the invoicing provider&apos;s own customer portal in your browser, where you change how you pay, read and download your invoices as PDFs, and cancel. The link is created at the moment you click it and is good for an hour — press the button again rather than keeping the tab.&lt;/p&gt;
&lt;p&gt;Your invoices are also listed on the Billing page, with the number, date, state and total of each, and each issued invoice has a &lt;strong&gt;Download PDF&lt;/strong&gt; button on its row, so the file is one click away without leaving the page. The billing details that get printed on them — a company name, an invoice address, a country picked from a list, a VAT number, an invoice email — are a two-column form at the top of that same page, saved with one button, and an organization keeps its own set, separate from your personal ones. The provider works out the VAT from those details, including reverse charge for a business in another EU country, so a VAT number is worth entering before you buy.&lt;/p&gt;
&lt;p&gt;Plexus itself works out no amount at all: the price on the Billing page is read from the provider&apos;s product, and every number with a currency on it lives with the provider who issues the invoice, which is the only way to be sure there is one set of figures rather than two that can drift.&lt;/p&gt;
&lt;h2 id=&quot;if-a-payment-fails&quot;&gt;If a payment fails&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Nothing is switched off.&lt;/strong&gt; If a card expires or a direct debit is refused, your plan stays active and every seat stays exactly where it was, for the whole sequence of reminders. The app and the account panel show that a payment is late, and that is the entire consequence — an unpaid invoice is a payments problem, not a reason to take a team&apos;s tools away.&lt;/p&gt;
&lt;p&gt;Sort it out under &lt;strong&gt;Payment method &amp;amp; invoice PDFs&lt;/strong&gt; (&lt;strong&gt;Manage billing&lt;/strong&gt; in the app) and the notice clears on its own. A plan only ends if you cancel it — in which case it runs to the end of the period you have already paid for — or if an invoice is eventually written off as uncollectible.&lt;/p&gt;
&lt;h2 id=&quot;the-account-menu-in-the-app-bar&quot;&gt;The account menu in the app bar&lt;/h2&gt;
&lt;p&gt;There is a new avatar at the right-hand end of the app bar. Signed in, it shows who you are and offers Account settings, a link to manage your account on the web, and Sign out. Signed out, it offers to sign you in or create an account. In compact mode it is the circle alone, like everything else up there.&lt;/p&gt;
&lt;h2 id=&quot;signed-in-devices&quot;&gt;Signed-in devices&lt;/h2&gt;
&lt;p&gt;Both the app and the web panel list every machine your account is signed in on, when each was added and when it was last used, with the one you are sitting at marked. You can sign any of them out, or all of them at once, and that machine is asked to sign in again the next time it contacts us. A sign-in also expires on its own after a year of not being used.&lt;/p&gt;
&lt;p&gt;The list records the machine name you were shown before it was stored, its platform and its Plexus version. It deliberately holds no IP address and no browser identification string.&lt;/p&gt;
&lt;h2 id=&quot;a-calmer-settings&quot;&gt;A calmer Settings&lt;/h2&gt;
&lt;p&gt;Settings has been rebuilt to be quieter. Every page is now a short list: a setting&apos;s name on the left and its current value on the right, with nothing else in the way. Select a row and a side panel opens on the right with one sentence on what the setting does, its choices, and &lt;strong&gt;Where this comes from&lt;/strong&gt;. When there is more to say, &lt;strong&gt;More detail&lt;/strong&gt; holds the full explanation. Switches can be flipped straight from the list, and on a narrow window the side panel slides over the list instead. The arrow keys move through the rows, Enter opens the side panel and Esc closes it.&lt;/p&gt;
&lt;p&gt;The sidebar is down to eight pages: &lt;strong&gt;General&lt;/strong&gt;, &lt;strong&gt;Appearance&lt;/strong&gt;, &lt;strong&gt;Agent&lt;/strong&gt;, &lt;strong&gt;Git&lt;/strong&gt;, &lt;strong&gt;Worktrees &amp;amp; hooks&lt;/strong&gt;, &lt;strong&gt;Shortcuts&lt;/strong&gt;, &lt;strong&gt;Prompts&lt;/strong&gt; and &lt;strong&gt;About&lt;/strong&gt;. Your account sits at the foot of it, under your name: &lt;strong&gt;My account&lt;/strong&gt;, &lt;strong&gt;Sync&lt;/strong&gt; and &lt;strong&gt;Organizations&lt;/strong&gt;. A few things moved on the way:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Advanced&lt;/strong&gt; is gone. Its settings are on &lt;strong&gt;General&lt;/strong&gt;, under &lt;strong&gt;Terminal&lt;/strong&gt;, &lt;strong&gt;Performance&lt;/strong&gt;, &lt;strong&gt;Claude CLI&lt;/strong&gt; and &lt;strong&gt;Diagnostics&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Git providers&lt;/strong&gt; is now &lt;strong&gt;Providers&lt;/strong&gt;, the first part of the &lt;strong&gt;Git&lt;/strong&gt; page.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Git &amp;amp; PRs&lt;/strong&gt; is now &lt;strong&gt;Git&lt;/strong&gt;, and it still holds the code review settings.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Keybindings&lt;/strong&gt; is now &lt;strong&gt;Shortcuts&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Worktrees &amp;amp; Hooks&lt;/strong&gt; is now &lt;strong&gt;Worktrees &amp;amp; hooks&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Every setting keeps its label and its default.&lt;/p&gt;
&lt;p&gt;Workspace and project settings got simpler too. Open &lt;strong&gt;Settings…&lt;/strong&gt; from a workspace&apos;s or a project&apos;s menu and an &lt;strong&gt;Applies to&lt;/strong&gt; choice at the top switches between &lt;strong&gt;Everywhere&lt;/strong&gt;, the workspace and the project. There are no more &lt;strong&gt;Override parent settings&lt;/strong&gt; switches. Each setting overrides on its own: change a value and it applies at that level, and &lt;strong&gt;Use workspace value&lt;/strong&gt;, &lt;strong&gt;Use global value&lt;/strong&gt; or &lt;strong&gt;Use built-in default&lt;/strong&gt; puts it back. A setting your organization enforces shows a lock, and its side panel says who set it.&lt;/p&gt;
&lt;h2 id=&quot;one-organization-at-a-time&quot;&gt;One organization at a time&lt;/h2&gt;
&lt;p&gt;Organizations have a page of their own. &lt;strong&gt;Settings → Organizations&lt;/strong&gt; has an organization picker at the top, with &lt;strong&gt;New organization&lt;/strong&gt; in it; pick one, and everything below is about that one: &lt;strong&gt;Name&lt;/strong&gt; (your role and how many people are in it, with &lt;strong&gt;Rename&lt;/strong&gt; and &lt;strong&gt;Delete&lt;/strong&gt;), &lt;strong&gt;Plan, seats and people&lt;/strong&gt;, &lt;strong&gt;Shared workspaces&lt;/strong&gt;, &lt;strong&gt;Managed settings&lt;/strong&gt; and &lt;strong&gt;Published prompts&lt;/strong&gt;, each opening in the side panel.&lt;/p&gt;
&lt;p&gt;Until now that was spread over two pages. The account page held the list, with each organization&apos;s plan, seats and people under its row; the old Organization page held the three things an organization hands its members, each listing every organization you belong to one after the other — so with three organizations it was three lists of three, and &amp;quot;Acme&apos;s settings&amp;quot; was never on screen by itself. Now it is. Each row is about the organization you picked, a feature one organization&apos;s plan does not include is said so in that organization&apos;s row and nowhere else, and nothing about an organization is read until it is the one you are looking at — an account in eight organizations makes one billing request here, not eight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My account&lt;/strong&gt; keeps your sign-in, the web launchers, your own plan and your signed-in devices; your organizations are on their own page, right below it in the sidebar. Two shortcuts follow from the move: &lt;strong&gt;Manage organization&lt;/strong&gt; on a shared workspace&apos;s ⋯ menu opens the page on the organization that shared it, and &lt;strong&gt;Manage seats&lt;/strong&gt; on an over-capacity banner opens that organization&apos;s plan on the same page instead of leaving for another one.&lt;/p&gt;
&lt;h2 id=&quot;your-settings-follow-you&quot;&gt;Your settings follow you&lt;/h2&gt;
&lt;p&gt;Signed in on a plan, your settings, your workspaces and your projects can now be the same on every machine you use. Turn it on under &lt;strong&gt;Settings → Sync&lt;/strong&gt; with &lt;strong&gt;Sync this machine&lt;/strong&gt;, and set how closely Plexus watches with &lt;strong&gt;Check for changes every (minutes)&lt;/strong&gt; — anything from 5 minutes to a day. Plexus checks when it starts, when you switch back to its window, a couple of seconds after you change a setting, and then on that schedule on its own for as long as it is running — it does not need the window in front of you, and it never needs a restart, so a change made on your other machine reaches this one without you touching anything. That number is the shortest gap between any two checks rather than the only moment one happens, whichever of the four prompted it, and it counts the time the machine was actually awake, so a laptop that spent the night closed does not fire off a burst of checks the second you open the lid.&lt;/p&gt;
&lt;p&gt;What crosses is the settings you have changed from their defaults, the names, descriptions and order of your workspaces and projects, each project&apos;s base branch, and which repository each project stands for. Overrides follow the thing they were set on: the review instructions you wrote for one repository on the desktop are the review instructions you get for it on the laptop. There is one exception, and it is the only one — your own override on a workspace your organization shares stays on the machine you set it on; see &lt;em&gt;Workspaces your organization shares&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two machines that changed different settings both keep their changes.&lt;/strong&gt; Each device sends only the keys it actually touched, so there is nothing to resolve, no prompt, and nothing lost. Change the same setting in two places and the one your account received last is the one you end up with everywhere — ordered by your account&apos;s own counter and never by a machine&apos;s clock, so a laptop that is ten minutes fast cannot quietly win every disagreement. A change you have made but not yet sent always beats what arrives, so a value you typed thirty seconds ago is never replaced by the one you replaced.&lt;/p&gt;
&lt;p&gt;Both switches are &lt;strong&gt;per machine&lt;/strong&gt;. Turning sync off on your laptop never turns it off on your desktop, and a machine with no internet connection keeps working exactly as it does today. A sync that fails never signs you out anywhere.&lt;/p&gt;
&lt;h2 id=&quot;you-see-everything-before-it-leaves&quot;&gt;You see everything before it leaves&lt;/h2&gt;
&lt;p&gt;Nothing is sent until you have read it. The first time you turn sync on, Plexus opens a setup right on the Sync page, below the switch, listing everything that would leave this computer — every setting key and the value you gave it, every workspace and project name and description, every repository slug, and every clone URL — with a switch beside each workspace and project to keep it off your account entirely. Excluding a workspace excludes every project inside it, and nothing about an excluded project crosses: not its name, not its slug, not its existence.&lt;/p&gt;
&lt;p&gt;The list opens with a one-line count of what is in it and is split into sections that show their count on the heading: workspaces and projects start open, while the settings and what stays on this machine start folded away, a click from being read. A folded section still holds every row it counts, so nothing about what is sent changes. &lt;strong&gt;Send this and turn on sync&lt;/strong&gt; sits in a bar pinned to the bottom beside &lt;strong&gt;Cancel&lt;/strong&gt;, so it stays in reach however long the list gets.&lt;/p&gt;
&lt;p&gt;That list stays reachable afterwards from &lt;strong&gt;What this machine sends…&lt;/strong&gt;, which opens it in place on the same page, so it is not a one-time door. Excluding something you had already synced takes it back off your account on the next check.&lt;/p&gt;
&lt;p&gt;The setup also names what stays here, and why:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fifteen settings describe this particular machine and can never cross&lt;/strong&gt; — the path to your &lt;code&gt;claude&lt;/code&gt; binary, your shell and shell path, your port window, your warm-session budget, your hook timeout, your reshape fetch preference, all three diagnostics settings, the two switches for sync itself, and the two that changed sides in this release (see &lt;em&gt;Two settings that now stay on the machine you set them on&lt;/em&gt;). They are refused on the way out and again on the way in, so no other machine can write them here either.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A path that only means something here is held back and named.&lt;/strong&gt; Older versions of Plexus accepted an absolute value in &lt;strong&gt;Where to create session folders&lt;/strong&gt;, &lt;strong&gt;Files and folders to copy&lt;/strong&gt; or &lt;strong&gt;Write ports to file&lt;/strong&gt;; those are your username and your folder layout, so they stay put.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A single value too large for the wire is held back&lt;/strong&gt;, listed by name in Settings, and everything else keeps syncing.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Three settings that &lt;em&gt;do&lt;/em&gt; travel are flagged for a second look first, because their value has a consequence on the machine receiving it: &lt;strong&gt;Run scripts committed to the repository&lt;/strong&gt;, &lt;strong&gt;Let the agent work without asking permission&lt;/strong&gt;, and &lt;strong&gt;When you remove a session&lt;/strong&gt; set to delete.&lt;/p&gt;
&lt;p&gt;Clone URLs travel with any password removed, and on &lt;code&gt;https&lt;/code&gt; with the username removed too. Your code, your keys, your sessions, your worktrees, your hooks, your transcripts, your pull-request records and every absolute path on your disk are never sent at all.&lt;/p&gt;
&lt;h3 id=&quot;if-your-account-already-holds-settings-from-another-machine&quot;&gt;If your account already holds settings from another machine&lt;/h3&gt;
&lt;p&gt;You choose what happens, once, from three cards in the setup. With &lt;strong&gt;Merge&lt;/strong&gt; picked, it also shows you which settings the two sides disagree about before you confirm:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Merge&lt;/strong&gt; — the default. Keys only this machine has are added to your account, and each disagreement is settled one setting at a time, with this machine&apos;s value already picked because you are sitting at it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Keep this machine&apos;s&lt;/strong&gt; — your account is replaced with what is here.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Take the account&apos;s&lt;/strong&gt; — this machine takes what the account holds. Before anything is overwritten, this machine&apos;s state is written to the version history, so the decision can be undone.&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;version-history-and-putting-a-version-back&quot;&gt;Version history, and putting a version back&lt;/h2&gt;
&lt;p&gt;Your account keeps the last &lt;strong&gt;twenty&lt;/strong&gt; versions of your settings and of your workspaces and projects. &lt;strong&gt;Settings → Sync → History&lt;/strong&gt; lists them, newest first, each with when it was written, which of your machines wrote it, how it came to exist — saved, replaced or restored — and how many items it held. Any of them but the current one can be put back.&lt;/p&gt;
&lt;p&gt;A restore is written &lt;strong&gt;forward&lt;/strong&gt;, as a new version, rather than rewinding the counter. Nothing already in the history is lost by one, every other machine picks it up through its next ordinary check with no special handling, and a restore is itself undoable by restoring the version before it.&lt;/p&gt;
&lt;p&gt;The machine&apos;s name is recorded at the moment it wrote the version, so the history still reads correctly after you sign that device out — and signing a device out never deletes anything it synced.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stop syncing and forget what we hold&lt;/strong&gt; erases everything sync has stored on your account: the current values, every retained version, and every workspace and project name. This machine is untouched and Plexus keeps working exactly as it does now. Deleting your Plexus account takes all of it with it too.&lt;/p&gt;
&lt;h2 id=&quot;projects-that-are-not-on-this-machine&quot;&gt;Projects that are not on this machine&lt;/h2&gt;
&lt;p&gt;With sync on, a project you added on another computer appears in this one&apos;s sidebar, under the workspace it belongs to, marked &lt;strong&gt;Not on this machine&lt;/strong&gt; alongside the repository it stands for. It is an ordinary row rather than a warning — a repository you have on your laptop simply is not checked out here yet.&lt;/p&gt;
&lt;p&gt;Most of the time you will never see one, because Plexus links the two sides itself. It compares the &lt;code&gt;host/owner/name&lt;/code&gt; of every remote each checkout has configured, so a fork links through its upstream and an SSH clone links to an HTTPS one; case, a trailing &lt;code&gt;.git&lt;/code&gt;, a port, a login name in the URL and any &lt;code&gt;url.&amp;lt;base&amp;gt;.insteadOf&lt;/code&gt; shortcut you have configured are all normalised away first. Self-hosted GitLab, Gitea and GitHub Enterprise repositories are matched exactly like github.com ones, and no repository URL is ever looked up or contacted — a slug is only ever compared against your own checkouts.&lt;/p&gt;
&lt;p&gt;Where it cannot be sure, it asks rather than guesses. Each row offers:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Locate…&lt;/strong&gt; — point at the folder if the repository is already here. If that folder&apos;s remotes do not match the synced ones, Plexus says so and links it anyway, because that is what a fork looks like. Pointing it at a session&apos;s worktree is refused with a sentence saying why: that folder is deleted when the session is torn down, and it would take the project&apos;s settings with it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Clone…&lt;/strong&gt; — hand the synced clone URL to the usual Add repository dialog, choose where it goes, and the new checkout arrives already linked, with its settings and its place in the tree.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Choose a matching repository…&lt;/strong&gt; — when more than one repository here shares a remote with the synced project, Plexus lists each folder with the remotes it matched on, and you pick.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Stop showing … here&lt;/strong&gt; — removes the row on this computer only. It does not delete the project for any other device.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;A project whose folder has been moved, unmounted or deleted is now marked on its row rather than removed, with the path it is looking for. Nothing is deleted for it — its settings and its sessions are all kept, and the row goes back to normal the moment the folder does.&lt;/p&gt;
&lt;p&gt;Deleting a workspace or a project on one machine is never an instruction to destroy work on another. If the other machine has a session or a worktree under it, the row stays exactly where it is and simply stops following your account.&lt;/p&gt;
&lt;h2 id=&quot;two-settings-that-now-stay-on-the-machine-you-set-them-on&quot;&gt;Two settings that now stay on the machine you set them on&lt;/h2&gt;
&lt;p&gt;Two settings that used to be ordinary preferences are now classified as belonging to &lt;em&gt;this device&lt;/em&gt; rather than to you, which means they will never travel between your machines even with sync on:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Show commit author avatars from Gravatar&lt;/strong&gt;, under Git. It is a privacy switch, and a privacy switch that follows you is one you can turn off on your laptop while your desktop carries on asking a third party who wrote each commit.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Clean up a session when its pull request is merged&lt;/strong&gt;, under Git. Turning it on is the consent for an unattended, unconfirmed worktree removal, and that consent should not arrive on a machine nobody is sitting at, weeks after you gave it somewhere else.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Nothing changes on the machine you set them on: same label, same default, same place, and whatever you have chosen is kept exactly as it is. What changes is that from now on you set each of them per machine. Being wrong in this direction costs one re-typed toggle; being wrong in the other costs a worktree somebody was using.&lt;/p&gt;
&lt;h2 id=&quot;the-prompt-library&quot;&gt;The prompt library&lt;/h2&gt;
&lt;p&gt;Some prompts you write once and then rewrite from memory forever — the review one, the &amp;quot;work out why this test is failing&amp;quot; one, the release-notes one. Plexus now has somewhere for them to live. Save a prompt under a name, turn the parts that change into fields, and run it again from the New Session dialog or straight into a session that is already going.&lt;/p&gt;
&lt;p&gt;The fields are typed, which is the difference between this and a text file you keep open in another window. A &lt;strong&gt;choose one&lt;/strong&gt; field is a list you write yourself, so nobody has to remember whether it is &amp;quot;perf&amp;quot; or &amp;quot;performance&amp;quot;. A &lt;strong&gt;checkbox&lt;/strong&gt; switches a whole paragraph of the prompt on and off rather than blanking a word. A field can be &lt;strong&gt;needed&lt;/strong&gt;, so the prompt cannot run half-filled. And two kinds only Plexus can offer, because it is the thing holding your worktree and your git state: a &lt;strong&gt;file&lt;/strong&gt; field suggests paths from the project you are actually in, and a &lt;strong&gt;branch&lt;/strong&gt; field suggests that project&apos;s branches, local and remote.&lt;/p&gt;
&lt;p&gt;Write &lt;code&gt;{{name}}&lt;/code&gt; in the prompt where a value goes, and &lt;code&gt;{{?flag}}&lt;/code&gt; … &lt;code&gt;{{/flag}}&lt;/code&gt; around a part a checkbox turns on and off. Doubled braces rather than &lt;code&gt;$name&lt;/code&gt; for one reason that matters here: prompts in this app are full of shell, and &lt;code&gt;$VAR&lt;/code&gt; collides with it.&lt;/p&gt;
&lt;h3 id=&quot;where-they-live-and-what-that-means&quot;&gt;Where they live, and what that means&lt;/h3&gt;
&lt;p&gt;A template is filed under &lt;strong&gt;just you&lt;/strong&gt;, &lt;strong&gt;a workspace&lt;/strong&gt; or &lt;strong&gt;a project&lt;/strong&gt;, and the list shows all of them together with a badge saying which — there is no override chain, so two templates with the same name are two templates. Templates you save are kept in your Plexus account, so they follow you to every machine you sign in on. That part needs a plan; see below.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A project can also commit its own.&lt;/strong&gt; Drop a markdown file into &lt;code&gt;.plexus/templates/&lt;/code&gt; in a repository and everybody who clones it gets that prompt in their list, badged &lt;strong&gt;Repository&lt;/strong&gt;. Those work with no account and no plan at all, and they are the one kind that &lt;strong&gt;never leaves your computer&lt;/strong&gt; — there is no field on the wire that could carry one. If you would rather not see a repository&apos;s prompts, &lt;strong&gt;Use prompt templates committed to the repository&lt;/strong&gt; turns them off, globally or for one project.&lt;/p&gt;
&lt;h3 id=&quot;running-one&quot;&gt;Running one&lt;/h3&gt;
&lt;p&gt;In the &lt;strong&gt;New session&lt;/strong&gt; dialog a &lt;strong&gt;Template&lt;/strong&gt; field appears above the branch fields once you have saved something. Pick one, fill it in, and the rendered prompt is waiting in the terminal when the agent comes up — including when you have auto-start off, in which case it waits until you press Start. In a session already running, &lt;strong&gt;Insert prompt&lt;/strong&gt; in the footer of the Agent tab does the same thing.&lt;/p&gt;
&lt;p&gt;Either way the text is &lt;strong&gt;typed into the terminal and left there&lt;/strong&gt;. Plexus never presses return for you: you read what it wrote and send it yourself.&lt;/p&gt;
&lt;h3 id=&quot;starting-from-a-session-that-already-worked&quot;&gt;Starting from a session that already worked&lt;/h3&gt;
&lt;p&gt;The prompt worth keeping is usually one that already did the job. &lt;strong&gt;Save as template…&lt;/strong&gt; in a session&apos;s ⋯ menu lifts that session&apos;s opening prompt into a new template, ready to edit — and it works on a session that is stopped or archived, which is when you actually know it was worth keeping.&lt;/p&gt;
&lt;h3 id=&quot;before-anything-leaves-your-machine&quot;&gt;Before anything leaves your machine&lt;/h3&gt;
&lt;p&gt;Nothing is sent until you say so. &lt;strong&gt;Show me what this machine would send…&lt;/strong&gt; lists every prompt that would go, in full, alongside everything staying here and why — and only then does the first one leave. Afterwards the Prompts page tells you when it last checked, which machine wrote last, and how many prompts are still waiting to go, so &amp;quot;you have nothing saved&amp;quot; and &amp;quot;we could not reach the account&amp;quot; never look the same.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Delete every template we hold&lt;/strong&gt; erases the lot from your account, and it never stops working — not on a lapsed plan, not on a cancelled one. It leaves the copies on your computer exactly where they are.&lt;/p&gt;
&lt;h3 id=&quot;what-a-plan-does-and-does-not-gate-here&quot;&gt;What a plan does and does not gate here&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Saving a prompt to your account needs a plan.&lt;/strong&gt; Reading, running, copying, exporting and deleting the ones you already have do not, and never will: your templates live on your disk as well as in your account, so a plan that ends takes away the ability to write new ones and nothing else. Every template you had keeps listing, keeps running, and can still be deleted or exported. Repository templates are unaffected either way.&lt;/p&gt;
&lt;h2 id=&quot;workspaces-your-organization-shares&quot;&gt;Workspaces your organization shares&lt;/h2&gt;
&lt;p&gt;An organization can now set a workspace up once and hand it to the people in it. It has a name, a description, a rule about who may join, and a list of the repositories that belong in it — and everybody who is in it gets the same one. You will find them on &lt;strong&gt;Settings → Organizations&lt;/strong&gt;, under &lt;strong&gt;Shared workspaces&lt;/strong&gt; for the organization you pick.&lt;/p&gt;
&lt;p&gt;On your own machine it is an ordinary workspace. It sits in the sidebar with the rest, carries your organization&apos;s name, and you open Settings on it and configure it exactly like any other. What the organization owns is its name, its description and the repositories attached to it. Your sessions, your checkouts and your own settings for it are yours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The repositories arrive already attached.&lt;/strong&gt; Each one appears under the workspace the moment you join, marked &lt;strong&gt;Not on this machine&lt;/strong&gt; beside the repository it stands for, and a &lt;strong&gt;Clone&lt;/strong&gt; button beside it hands its address to the usual Add repository dialog — you choose where it goes, and the new checkout arrives already in the right place. Nothing is downloaded onto your computer until you ask for it, so joining a workspace with nine repositories in it costs you nothing on disk. If a repository was attached without an address, the button says so and tells you to ask an administrator for one, rather than failing when you press it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This needs a seat.&lt;/strong&gt; An organization&apos;s workspaces reach the members who hold a seat on its plan, and nobody else. An organization is allowed to have more members than seats — that is deliberate, not an accounting mistake — and &lt;strong&gt;a member without a seat keeps everything Plexus did before, in full&lt;/strong&gt;; what they do not get is the organization&apos;s workspaces.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It does not need cross-device sync switched on.&lt;/strong&gt; &lt;strong&gt;Sync this machine&lt;/strong&gt;, under Settings → Sync, is your consent for this computer&apos;s own settings and layout to &lt;em&gt;leave&lt;/em&gt;, and it is off until you turn it on. Your organization&apos;s workspaces are a list &lt;em&gt;arriving&lt;/em&gt;, so a brand-new laptop that has never had sync turned on receives them as soon as you sign in and hold a seat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And one thing about a shared workspace does not follow you between your own machines.&lt;/strong&gt; Your own settings override on a workspace your organization shares stays on the machine you set it on. The organization&apos;s side of it is the same everywhere; your personal change to it is per machine, unlike the overrides on your own workspaces, which do travel. If you want the same override on your laptop, set it there too.&lt;/p&gt;
&lt;h2 id=&quot;joining-and-leaving&quot;&gt;Joining and leaving&lt;/h2&gt;
&lt;p&gt;There are three ways a shared workspace reaches you, and the workspace itself says which:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Open&lt;/strong&gt; — anyone in the organization can join it, with one click.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Request&lt;/strong&gt; — you ask, and an administrator answers. Until they do, the row says it is waiting, and you can cancel an ask you have not had answered.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Invite only&lt;/strong&gt; — an administrator adds you, and it appears.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;If you asked and were not added, the row says so and gives you the date you can ask again. It is a pause and not a verdict: an administrator can still add you at any time before then, and nothing about it follows you anywhere else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Leaving always works.&lt;/strong&gt; It sits beside the workspace&apos;s row in Settings, and on the workspace&apos;s ⋯ menu in the sidebar — where it stays whatever happens to a plan or a seat. It is never behind either one, and it keeps working for an organization whose plan has lapsed. Being able to stop receiving something is not the kind of thing a subscription gets to take away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And leaving deletes nothing.&lt;/strong&gt; The workspace stays in your sidebar, its repositories stay on disk, and their sessions, worktrees and branches are left exactly as they are. It simply stops being your organization&apos;s: the name stops being updated, new repositories stop arriving, and what you are left with is an ordinary workspace of your own.&lt;/p&gt;
&lt;p&gt;The confirmation tells you what getting back in would take &lt;strong&gt;before&lt;/strong&gt; you press it, because the three modes do not agree — an open workspace you can rejoin whenever you like, a request one you would have to ask for again, and an invite-only one you cannot rejoin at all until an administrator adds you back.&lt;/p&gt;
&lt;h2 id=&quot;where-a-workspace-came-from&quot;&gt;Where a workspace came from&lt;/h2&gt;
&lt;p&gt;A workspace can appear in your sidebar without you having done anything, because that is what an organization sharing one means. So every shared workspace&apos;s ⋯ menu has &lt;strong&gt;Why do I have this?&lt;/strong&gt;, and it answers in one sentence: you were added automatically because your organization gives this workspace to every new member, you joined it yourself, a named person added you, you asked and a named person approved it, or somebody added everyone at once.&lt;/p&gt;
&lt;p&gt;That name is recorded at the moment you were added, so the answer still reads correctly after the person who added you leaves the organization or deletes their account. It is two facts and no more — there is no history behind it and there will not be one.&lt;/p&gt;
&lt;p&gt;The same dialog says who can join the workspace, and spells out the split that explains the menu: the name, the description and the repositories are your organization&apos;s, and your own settings, sessions and checkouts are yours. That is why a shared workspace cannot be renamed, deleted or set as your default from your machine — those all belong to the organization — while &lt;strong&gt;Settings…&lt;/strong&gt; stays exactly where it was.&lt;/p&gt;
&lt;h2 id=&quot;auto-add-applies-to-new-members-only&quot;&gt;Auto-add applies to new members only&lt;/h2&gt;
&lt;p&gt;A shared workspace has an &lt;strong&gt;Add everyone automatically&lt;/strong&gt; switch. Turn it on and everybody who joins the organization from then on receives the workspace without having to ask for it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Turning it off later removes nobody.&lt;/strong&gt; The switch is read once, when a new person joins the organization, and it is never a member list reconciled against the workspace. There is no way to express &amp;quot;un-share this from the people who already have it&amp;quot; as a side effect of a toggle — somebody stops being in a workspace only by leaving it or by an administrator taking them out, both of which are deliberate acts on a named person.&lt;/p&gt;
&lt;p&gt;That is a decision rather than an oversight. People run agent sessions inside these workspaces, and a switch that quietly pulled a workspace out from under a running session would be a far worse surprise than a switch that means exactly what it says.&lt;/p&gt;
&lt;p&gt;To give the workspace to the people who are already in the organization, add them — one at a time from the app, or with &lt;strong&gt;Add everyone&lt;/strong&gt; on the account panel on the web, which tells you how many people it is about to add before it does it.&lt;/p&gt;
&lt;h2 id=&quot;managing-shared-workspaces-from-the-app&quot;&gt;Managing shared workspaces from the app&lt;/h2&gt;
&lt;p&gt;None of the administration needs the web. &lt;strong&gt;Settings → Organizations&lt;/strong&gt; shows one organization at a time; open its &lt;strong&gt;Shared workspaces&lt;/strong&gt; row, press &lt;strong&gt;Manage&lt;/strong&gt;, and you get its workspaces with everything an administrator does:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New workspace&lt;/strong&gt; — a name, a description, who may join, and the auto-add switch.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Edit&lt;/strong&gt; — all of the same, afterwards.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Repositories&lt;/strong&gt; — attach one by name and its &lt;code&gt;host/owner/name&lt;/code&gt; slug, with an optional clone URL and base branch, or remove one again.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;People&lt;/strong&gt; — who is in the workspace, who is waiting to join, and the buttons to add somebody, answer a request, or take somebody out.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Withdraw&lt;/strong&gt; — stop the organization handing the workspace out. Nobody&apos;s checkouts, sessions, worktrees or branches are touched. On every machine that already has it the workspace stays exactly where it is, with its repositories and everything anybody has done in them, and simply stops being your organization&apos;s: the name comes off it, and nothing further arrives.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What you can do is decided by your role in the organization&lt;/strong&gt;, not by which build you happen to be running: the app asks the server what you may do and offers exactly that. Out of the box owners and administrators can do all of it, and everybody else can join, ask and leave — and the five workspace permissions are ordinary tickable boxes in the role editor, so you can copy a role and hand any part of it to whoever should have it.&lt;/p&gt;
&lt;p&gt;One rule about clone URLs is worth knowing before you type one. &lt;strong&gt;&lt;code&gt;https://&lt;/code&gt;, &lt;code&gt;ssh://&lt;/code&gt; and &lt;code&gt;git@host:owner/name&lt;/code&gt; are accepted; plain &lt;code&gt;http://&lt;/code&gt; is not.&lt;/strong&gt; This is an address handed to every member&apos;s machine, and an &lt;code&gt;http://&lt;/code&gt; clone would send a colleague&apos;s git credentials across their network in the clear.&lt;/p&gt;
&lt;h2 id=&quot;when-more-seats-are-handed-out-than-are-paid-for&quot;&gt;When more seats are handed out than are paid for&lt;/h2&gt;
&lt;p&gt;An organization can end up with more people holding a seat than the plan pays for — a seat count lowered, a plan changed, an invoice that has not caught up. &lt;strong&gt;Nothing is switched off and nobody loses a workspace.&lt;/strong&gt; Everyone keeps every workspace they have, keeps receiving its repositories, and keeps joining, asking and leaving.&lt;/p&gt;
&lt;p&gt;What pauses is the short list of acts that add or change: creating a workspace, editing one, attaching a repository, adding somebody to one, and approving a request. Each is refused with a sentence naming two numbers — what the organization pays for, and how many people hold a seat — and a banner at the top of the page says the same with &lt;strong&gt;Manage seats&lt;/strong&gt; beside it. No member is named, and no seat is taken off anybody to make the sums work.&lt;/p&gt;
&lt;p&gt;Everything that takes something away keeps working, deliberately: withdrawing a workspace, detaching a repository, removing somebody, saying no to a request, and any member leaving on their own. The remedy for the refusal is to raise the seat count or take a seat back, and an organization that could not take a seat back could not do the thing it is being told to do.&lt;/p&gt;
&lt;h2 id=&quot;changes-arrive-while-the-app-is-open&quot;&gt;Changes arrive while the app is open&lt;/h2&gt;
&lt;p&gt;Until now a running Plexus learned what your account and your organization had to say when it started, and not afterwards. A seat granted this morning was invisible until you quit and reopened; a workspace your organization added while you were working turned up at the next launch.&lt;/p&gt;
&lt;p&gt;It now checks on its own while it is running. One setting governs both halves — &lt;strong&gt;Check for changes every (minutes)&lt;/strong&gt;, under &lt;strong&gt;Settings → Sync&lt;/strong&gt; — and a check also happens when Plexus starts, when you switch back to its window, and a couple of seconds after you change a setting. The number is shared; the switch above it is not. Your organization&apos;s half runs whether or not &lt;strong&gt;Sync this machine&lt;/strong&gt; is on, because it is a list arriving rather than anything of yours leaving. So a workspace added, renamed or withdrawn, a repository attached or detached, being added to a workspace or taken out of one, and a seat handed to you or taken back all reach a running app with no restart.&lt;/p&gt;
&lt;p&gt;Two things worth knowing about the number. It is the shortest gap between any two checks rather than the only moment one happens, whichever of the four prompted it. And it counts the time your machine was actually awake, so a laptop that spent the night closed does not fire off a burst of checks the second you open the lid.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sync now&lt;/strong&gt; under Settings → Sync still forces one immediately, and &lt;strong&gt;Refresh&lt;/strong&gt;, on the workspace list behind &lt;strong&gt;Manage&lt;/strong&gt;, does the same for an organization&apos;s catalogue.&lt;/p&gt;
&lt;h2 id=&quot;settings-your-organization-manages&quot;&gt;Settings your organization manages&lt;/h2&gt;
&lt;p&gt;An organization can now set some of Plexus&apos;s settings for the people in it. An administrator picks a setting, gives it a value, and chooses how strongly to mean it:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Recommended&lt;/strong&gt; — set once on each member&apos;s machine, as if they had typed it themselves. After that it is theirs: change it and the organization never puts it back. A changed recommendation updates a value you have not touched and leaves one you have, and withdrawing it takes back only a value nobody had touched.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Enforced&lt;/strong&gt; — applies on every member&apos;s machine and wins over everything: your own global value, and any override you set on a workspace, a project or a session. The row locks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Evaluate&lt;/strong&gt; — a dry run. Nothing on anybody&apos;s machine changes. The administrator sees how many devices &lt;em&gt;would&lt;/em&gt; change if the setting were enforced, and that is all they see.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What a locked row looks like.&lt;/strong&gt; The control is greyed and cannot be changed, there is no reset button, a lock sits beside the label, and the row says &lt;strong&gt;Managed by&lt;/strong&gt; your organization. Hover over it and it shows the organization&apos;s value beside the one you had set yourself. Your own value is not deleted — it is kept, and it comes back the day the organization relaxes the rule. Writing a locked setting from anywhere in the app is refused with a sentence naming the organization, never silently ignored.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It keeps its last known value when you are offline or a plan lapses, and unlocks only when you leave the organization.&lt;/strong&gt; A locked setting stays locked on a plane, on a laptop that has not spoken to us in a month, on a plan whose invoice bounced, and on a seat that was taken back. A value an organization set is a decision about a shared way of working, and it must not evaporate on the day the network does. It comes off only when the organization withdraws it, or when you are no longer in the organization at all — at which point every setting it managed unlocks and your own values return. Nothing you set yourself is ever deleted from your machine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The dry run sends one yes-or-no per setting per device, and nothing else.&lt;/strong&gt; While a setting is being evaluated, each of your machines reports whether its current value differs from the proposed one — a single yes or no per setting, no value, no name. The administrator sees &amp;quot;Would change on 3 of 12 devices&amp;quot;, and a count under five devices is folded into &amp;quot;Fewer than 5 devices reporting&amp;quot; rather than shown, unless it is everyone or nobody, so a report can never single out one person&apos;s setting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What can be managed.&lt;/strong&gt; The same sixty-seven settings that cross-device sync carries — the ones that mean the same thing on every machine. A setting that describes your particular computer — the path to your &lt;code&gt;claude&lt;/code&gt; binary, your shell, your port window, the switches for sync itself — cannot be set by an organization any more than it can follow you between your own machines. A value this version of Plexus does not know is listed as such and applied to nothing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where to find it.&lt;/strong&gt; The &lt;strong&gt;Managed settings&lt;/strong&gt; row of &lt;strong&gt;Settings → Organizations&lt;/strong&gt; lists everything the organization you picked currently sets on this machine, with the level of each and when it last checked; &lt;strong&gt;Refresh&lt;/strong&gt; asks for the latest. Administrators manage them there too: press &lt;strong&gt;Manage&lt;/strong&gt; in its side panel for the editor — publish a setting, pick its level, enforce or unenforce it, withdraw it, and read the dry-run counts — and the same page exists as &lt;strong&gt;Shared settings&lt;/strong&gt; on the account panel on the web. What you can do in it is decided by your role: viewing, editing and enforcing are three separate permissions, and all three are ordinary boxes in the role editor. When more seats are handed out than are paid for, publishing and enforcing pause the way creating a workspace does, and withdrawing and unenforcing keep working.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This needs a seat, not sync.&lt;/strong&gt; Like shared workspaces, managed settings reach the members who hold a seat on the organization&apos;s plan, and they arrive whether or not &lt;strong&gt;Sync this machine&lt;/strong&gt; is on — that switch is about your own settings leaving this computer, and these are values arriving. Withdrawing a setting and unlocking one never need a plan, so an organization whose plan has lapsed can always take a lock off. A member whose seat has gone keeps the lock and is told why on that page.&lt;/p&gt;
&lt;h2 id=&quot;prompts-your-organization-publishes&quot;&gt;Prompts your organization publishes&lt;/h2&gt;
&lt;p&gt;An organization can now keep prompt templates of its own and hand them to the people in it. Somebody proposes a template — a name, a description, the prompt with its &lt;code&gt;{{fields}}&lt;/code&gt;, exactly as in your own library — and somebody publishes it, and from then on every member holding a seat finds it in their template list, in the New Session picker and under &lt;strong&gt;Insert prompt&lt;/strong&gt;, badged &lt;strong&gt;Org · Acme&lt;/strong&gt;. Fix the prompt on the organization&apos;s side and everybody has the fix on their next check; nobody copies anything around, and nothing about Plexus itself has to be updated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A template is a list of revisions and one pointer.&lt;/strong&gt; Every proposal is a new, numbered revision, and a revision is never edited once it exists. Publishing moves the organization&apos;s &lt;em&gt;current&lt;/em&gt; pointer onto the draft; &lt;strong&gt;rolling back&lt;/strong&gt; moves it onto any earlier revision, in one action, and that reaches every member the same way a publish does. Members only ever receive the current revision — a draft is invisible to anybody outside the people who manage the library — and nothing changes a template out from under a session that already rendered it. &lt;strong&gt;Discard draft&lt;/strong&gt; drops a proposal that never went out, and &lt;strong&gt;Delete&lt;/strong&gt; retires the template: it disappears from every member&apos;s list on their next check, and its revisions go with it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your own templates are untouched, including one with the same name.&lt;/strong&gt; An organization&apos;s prompts sit beside yours in one list; they never replace, override or hide a template of your own. If you and your organization both have one called &amp;quot;Review&amp;quot;, you see both, and the badge is how you tell them apart — so both pickers now show a badge on every row, not only the organization&apos;s. You can copy an organization&apos;s template into your own library and change the copy; you cannot edit or delete the original from your own machine, because it is the organization&apos;s.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What an organization prompt may not contain.&lt;/strong&gt; Its text is typed into Claude Code&apos;s input on your machine, where a line starting with &lt;code&gt;!&lt;/code&gt; runs a shell command, a line starting with &lt;code&gt;/&lt;/code&gt; runs a slash command, and &lt;code&gt;@path&lt;/code&gt; attaches a file. An organization prompt is refused at the moment it is proposed if it starts with &lt;code&gt;!&lt;/code&gt; or &lt;code&gt;/&lt;/code&gt;, or mentions a file as &lt;code&gt;@path&lt;/code&gt; — an email address such as &lt;code&gt;dana@example.com&lt;/code&gt; is fine — and the same check runs again on every publish and every roll back. Plexus also strips those from an organization prompt as it types it, on your machine, so nothing an administrator publishes can run a command or attach a file on your computer. Your own templates, and the ones a repository commits, keep all three: you chose that content. And as with every template, the text is typed into the terminal and left there — Plexus never presses return for you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where to find it.&lt;/strong&gt; The &lt;strong&gt;Published prompts&lt;/strong&gt; row of &lt;strong&gt;Settings → Organizations&lt;/strong&gt; lists what the organization you picked has published to this machine, with each template&apos;s revision number and when the list was last checked; &lt;strong&gt;Refresh&lt;/strong&gt; asks for the latest. Administrators manage the library there too: press &lt;strong&gt;Manage&lt;/strong&gt; in its side panel to &lt;strong&gt;Propose&lt;/strong&gt; a new template, &lt;strong&gt;Publish draft&lt;/strong&gt;, open a template&apos;s &lt;strong&gt;Revisions&lt;/strong&gt;, &lt;strong&gt;Roll back…&lt;/strong&gt;, &lt;strong&gt;Discard draft&lt;/strong&gt; or &lt;strong&gt;Delete&lt;/strong&gt; — and &lt;strong&gt;Propose to organization…&lt;/strong&gt; on one of your own templates on the Prompts page starts a proposal from it. The same library is a &lt;strong&gt;Prompt library&lt;/strong&gt; page on the organization&apos;s account panel on the web. Five boxes in the role editor decide who does what — &lt;em&gt;Use prompts&lt;/em&gt;, &lt;em&gt;Propose prompts&lt;/em&gt;, &lt;em&gt;Publish prompts&lt;/em&gt;, &lt;em&gt;Manage revisions&lt;/em&gt; and &lt;em&gt;Delete prompts&lt;/em&gt; — and they are live now rather than &lt;em&gt;planned&lt;/em&gt;: Member and Restricted use and propose, Maintainer also publishes and rolls back, Admin and Owner do all five. A control your role does not grant is absent rather than greyed, and the organization&apos;s own service refuses the act itself if a stale screen lets a click through.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This needs a seat, not sync.&lt;/strong&gt; Receiving an organization&apos;s prompts needs its plan to include them and you to hold one of its seats, and they arrive whether or not &lt;strong&gt;Sync this machine&lt;/strong&gt; is on — they are text arriving, not anything of yours leaving. Proposing, publishing and rolling back need the plan too, and pause when more seats are handed out than are paid for, the way creating a workspace does. Three things never need any of it: the prompts already on your machine keep listing and running — offline, on a lapsed plan, and after a seat is taken back; discarding a draft and deleting a template keep working after a plan has ended, so a lapsed organization can always take back what it published; and your own library is yours whatever the organization does. An organization&apos;s prompts leave your machine in one case only — you leave the organization, or its answer says your role may no longer use them — and never because a check failed.&lt;/p&gt;
&lt;h2 id=&quot;your-issue-tracker-inside-plexus&quot;&gt;Your issue tracker, inside Plexus&lt;/h2&gt;
&lt;p&gt;A project&apos;s GitHub issues can now be worked inside Plexus — read, opened, edited, commented on and created — and a GitHub project&apos;s boards can be worked the same way, cards and all. Everything goes from your machine to GitHub with the account you connected under Git ▸ Providers, and a session started from an issue is tied to it from the moment it exists: the branch carries the issue number because Plexus named it, not because anything guessed at it afterwards.&lt;/p&gt;
&lt;h3 id=&quot;the-toolchain&quot;&gt;The Toolchain&lt;/h3&gt;
&lt;p&gt;Every workspace and every project now has a &lt;strong&gt;Toolchain&lt;/strong&gt;: a catalogue of the tools it can be connected to, one card per tool with an &lt;strong&gt;Available&lt;/strong&gt; or &lt;strong&gt;Installed&lt;/strong&gt; badge and a &lt;strong&gt;Configure&lt;/strong&gt; button. Two tools ship — &lt;strong&gt;GitHub issues&lt;/strong&gt;, one repository at a time, and &lt;strong&gt;GitHub Projects&lt;/strong&gt;, one project at a time — and each becomes a tab on the tab strip. Open the catalogue with the &lt;strong&gt;Settings&lt;/strong&gt; button at the right end of a project&apos;s or a workspace&apos;s tab strip.&lt;/p&gt;
&lt;p&gt;You no longer type a repository: &lt;strong&gt;Configure&lt;/strong&gt; opens a dialog with a search over the repositories your GitHub account can see (a project&apos;s own repository is suggested first), and the same search over projects for GitHub Projects. &lt;strong&gt;Detach&lt;/strong&gt; removes an instance and nothing else — no session, no link, nothing on GitHub.&lt;/p&gt;
&lt;p&gt;A workspace of ten services that share one tracker attaches it once. Each tool a workspace attaches has its own &lt;strong&gt;Share with projects&lt;/strong&gt; switch, and each project has &lt;strong&gt;Inherit the workspace&apos;s tools&lt;/strong&gt;; both are on by default, and a project sees a workspace tool when it inherits and that tool is shared. Nothing here needs a plan or a connection: the catalogue works before GitHub is connected and tells you the tabs will be empty until it is. The toolchain stays on the machine you set it up on — it is not part of what cross-device sync carries, and an organization&apos;s shared workspace does not carry one either.&lt;/p&gt;
&lt;h3 id=&quot;the-workspace-view&quot;&gt;The workspace view&lt;/h3&gt;
&lt;p&gt;Clicking a workspace&apos;s row opens a &lt;strong&gt;workspace view&lt;/strong&gt;, shaped like the project view: a &lt;strong&gt;Dashboard&lt;/strong&gt; tab showing the global dashboard pinned to that workspace, one tab per tool attached to the workspace, and the same &lt;strong&gt;Settings&lt;/strong&gt; button at the right end. The workspace&apos;s ⋯ menu gains &lt;strong&gt;Open&lt;/strong&gt;. The chevron keeps doing only what it did — collapsing and expanding.&lt;/p&gt;
&lt;h3 id=&quot;the-issues-tab-like-githubs&quot;&gt;The Issues tab, like GitHub&apos;s&lt;/h3&gt;
&lt;p&gt;The tab lists the repository&apos;s issues the way github.com does — the state glyph, the title, the labels, &lt;code&gt;#123 opened 3 days ago by author&lt;/code&gt;, the comment count, who is assigned — with &lt;strong&gt;Open&lt;/strong&gt; and &lt;strong&gt;Closed&lt;/strong&gt;, a search box, &lt;strong&gt;Assigned to me&lt;/strong&gt; / &lt;strong&gt;Mentioning me&lt;/strong&gt; / &lt;strong&gt;All&lt;/strong&gt;, and pickers for labels, assignee, milestone and sort. Pull requests are left out. The list refreshes itself every minute while Plexus is the focused window, every five minutes while it is merely visible, and not at all while it is hidden; &lt;strong&gt;Refresh&lt;/strong&gt; asks now, and two projects inheriting one tool share one request.&lt;/p&gt;
&lt;p&gt;Click a title and the issue opens inside the tab: the text rendered as GitHub renders it (images and other remote media are left out on purpose — Plexus never loads anything from the web into the app on your behalf), the labels, assignees and milestone in a side column, and the comments. Everything you can change on github.com you can change here — the title, the text with a write/preview editor, close or reopen, labels, assignees, the milestone, a new comment — and it is saved to GitHub the moment you do, undone with a message if GitHub refused. &lt;strong&gt;New issue&lt;/strong&gt; creates one from inside the tab.&lt;/p&gt;
&lt;p&gt;GitHub&apos;s answers are shown as they are. If it is rate-limiting you, the tab says so with a countdown and keeps the last list it had. If it rejects the token — or nothing is connected — the tab says so and offers &lt;strong&gt;Reconnect GitHub&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;boards-from-github-projects&quot;&gt;Boards from GitHub Projects&lt;/h3&gt;
&lt;p&gt;Attach a GitHub project and a &lt;strong&gt;Board&lt;/strong&gt; tab lists every one of its views. A board view renders as columns with the project&apos;s cards; drag a card to another column and its status changes on GitHub, drag it within a column and its position does. A table view renders the columns GitHub shows; a roadmap renders as a table. Click a card to open the issue behind it — the same view the Issues tab opens, with the same editing — and every issue card has &lt;strong&gt;Start session&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A view&apos;s filter is applied by Plexus itself, and where it uses something Plexus does not understand the tab says &lt;strong&gt;Filter partly applied&lt;/strong&gt; and names the parts it skipped, so a board never quietly shows fewer cards than GitHub does. Projects sit behind a GitHub permission a repository connection does not carry: the first time you attach one on a connection made before this release, Plexus asks you to &lt;strong&gt;Reconnect GitHub&lt;/strong&gt;, and reconnecting is enough. Nobody without a project attached is asked.&lt;/p&gt;
&lt;h3 id=&quot;start-a-session-from-an-issue-and-keep-it-beside-you&quot;&gt;Start a session from an issue, and keep it beside you&lt;/h3&gt;
&lt;p&gt;Every issue row, the opened issue and every issue card have &lt;strong&gt;Start session&lt;/strong&gt;. It opens the New session dialog with the name already filled in as &lt;code&gt;#123 The issue&apos;s title&lt;/code&gt;, a &lt;strong&gt;Linked to #123&lt;/strong&gt; chip under it, and a checkbox — on by default — &lt;strong&gt;Send the issue to the agent as the first prompt&lt;/strong&gt;, which types the issue&apos;s title, its link and its full text into the agent when it comes up, together with a request to reference &lt;code&gt;#123&lt;/code&gt; in its commits, after any template you also chose. The branch comes out as &lt;code&gt;plexus/123-the-issues-title&lt;/code&gt;, because that is what Plexus already does with a session called &lt;code&gt;#123 …&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The session then carries the issue with it. An &lt;strong&gt;Issue&lt;/strong&gt; button at the right end of the session&apos;s tab strip — and the &lt;strong&gt;#123&lt;/strong&gt; chip in the context bar — opens a sidebar on the right with the issue exactly as the Issues tab shows it, editable, resizable, remembered per session. The issue&apos;s row lists the session under &lt;strong&gt;Sessions&lt;/strong&gt;, and &lt;strong&gt;Create PR&lt;/strong&gt; starts its description with &lt;code&gt;Closes #123&lt;/code&gt;, so merging the pull request closes the issue on GitHub. The link is written when the session is created and lives as long as the session does.&lt;/p&gt;
&lt;h3 id=&quot;what-a-plan-gates-here-and-what-it-does-not&quot;&gt;What a plan gates here, and what it does not&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The tabs and the sidebar need a plan&lt;/strong&gt; — an individual plan, or a seat on an organization&apos;s. Listing, opening, editing, commenting, creating and working a board all go from your machine to GitHub with your own token, and every one of them is behind the same gate. It is the sixth thing a plan unlocks, and the first that is not a service we run: we are not told any of it happened. Without a plan the Issues tab, the Board tab and the sidebar show a locked pane in place of their content, and nothing else in the app changes — there is no lock on any tab, or anywhere else.&lt;/p&gt;
&lt;p&gt;Everything around them is free. The Toolchain catalogue, attaching and detaching tools, the switches, the repository and project pickers, the link a session carries, the &lt;strong&gt;#123&lt;/strong&gt; chip, the Sessions list on a row and the &lt;code&gt;Closes #123&lt;/code&gt; line are yours whether or not you hold a plan, and a plan that lapses hides the next list and nothing you already made.&lt;/p&gt;
&lt;h2 id=&quot;stacked-pull-requests-and-a-land-queue&quot;&gt;Stacked pull requests, and a land queue&lt;/h2&gt;
&lt;p&gt;Split a big change into a stack: start a session &lt;strong&gt;on top of&lt;/strong&gt; another one — &lt;strong&gt;New session on top…&lt;/strong&gt; in a session&apos;s ⋯ menu — and it nests under its parent in the sidebar, cuts its branch from the parent&apos;s, and opens its pull request against it, so every pull request shows only its own changes.&lt;/p&gt;
&lt;p&gt;Plexus then keeps the whole stack consistent while the agents work. When the session underneath moves ahead, every session above it is &lt;strong&gt;restacked&lt;/strong&gt; onto it as soon as its agent is idle, and pushed again if it was already pushed — with a lease, so a push someone else made is never overwritten. A restack that conflicts is never left half-done: Plexus puts the branch back and hands the conflict to that session&apos;s agent. When the bottom pull request merges, the ones above it are &lt;strong&gt;retargeted&lt;/strong&gt; and moved onto your main branch — and because Plexus remembers where each branch forked, that works after a squash merge too. Each pull request in a stack also lists the others at the end of its description.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Land stack…&lt;/strong&gt; merges a whole stack from the bottom up, through GitHub or Bitbucket: it waits for each pull request&apos;s checks, retargets and restacks the next one, and moves on, stopping with a reason the moment something needs you. &lt;strong&gt;Add to land queue&lt;/strong&gt; does the same for independent pull requests, and the &lt;strong&gt;Land queue&lt;/strong&gt; panel on the project dashboard shows where everything stands. On a GitHub branch that requires GitHub&apos;s own merge queue, Plexus adds the pull request to that queue instead of merging it.&lt;/p&gt;
&lt;p&gt;Stacks and landing need a plan. One part of this is free for everyone: a branch another session is based on is &lt;strong&gt;no longer deleted&lt;/strong&gt; when its own session is removed — including by the cleanup that runs after a pull request merges.&lt;/p&gt;
&lt;h2 id=&quot;what-a-plan-unlocks-and-what-it-never-will&quot;&gt;What a plan unlocks, and what it never will&lt;/h2&gt;
&lt;p&gt;Until this release we could say that nothing in Plexus at all was held back. This one introduces the first seven things a plan unlocks, so here is the exact shape of them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seven things need a Plexus account and a plan&lt;/strong&gt; — an individual plan, or a seat on an organization&apos;s. &lt;strong&gt;Cross-device sync&lt;/strong&gt;, &lt;strong&gt;saving a prompt template to your account&lt;/strong&gt;, &lt;strong&gt;receiving the workspaces an organization shares&lt;/strong&gt;, &lt;strong&gt;receiving the settings an organization manages&lt;/strong&gt;, &lt;strong&gt;receiving the prompts an organization publishes&lt;/strong&gt;, &lt;strong&gt;your issue tracker inside Plexus&lt;/strong&gt;, and &lt;strong&gt;stacked pull requests with a land queue&lt;/strong&gt;. All seven are &lt;strong&gt;new&lt;/strong&gt;: none of them has ever worked without a plan, in any version, for anybody, and nothing else in this release needs one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nothing that already worked moved behind the plan, and nothing ever will.&lt;/strong&gt; Sessions, worktrees, the agent terminal, the review tab, the explorer, the git client, pull requests, hooks, the dashboard, the tree and &lt;strong&gt;every setting&lt;/strong&gt; behave identically whether you are signed out, signed in, paying or not, holding a seat or not. There is no cap on sessions, projects or worktrees, now or ever, and no limit on the free part that a plan exists to remove. Everything a plan unlocks will be something that did not exist before it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And we will say so here, every time.&lt;/strong&gt; A feature that becomes conditional on a plan or a seat arrives as a section in these release notes and as an announced change to the Terms — never quietly, and never discovered. This is that section for all seven of them, and it is where the next one will be too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If a plan ends, you stop writing to those seven and nothing else changes.&lt;/strong&gt; Every machine keeps every setting, workspace and project it already has — the copy on your disk is the real one — and they simply stop exchanging changes with us. What your account holds is kept rather than deleted, so resuming picks up where you left off. Your prompt templates behave the same way and go one step further: every one of them keeps listing, running, copying and exporting, because the copy on your disk is complete. A workspace your organization shares behaves the same way again: it stays in your sidebar with its repositories, its sessions and its worktrees exactly as they are, and what stops is receiving the organization&apos;s changes to it and joining new ones. A setting your organization manages goes the same way, and deliberately further in one respect: an enforced value keeps its last known value and stays locked, because a lock that came off on the day an invoice bounced would be a rule that meant nothing — it unlocks when the organization withdraws it or when you leave. A prompt your organization published goes the way of its workspaces: every one already on your machine keeps listing and running, badge and all, and what stops is receiving the next revision. An Issues or Board tab shows its locked pane instead of the next list, and every tool you attached, every session you started from an issue, its &lt;strong&gt;#123&lt;/strong&gt; chip and its &lt;code&gt;Closes #123&lt;/code&gt; line stay exactly as they are. Sessions you stacked stay nested under their parents and can still be unstacked; what stops is the restacking, retargeting and landing. And &lt;strong&gt;Stop syncing and forget what we hold&lt;/strong&gt;, &lt;strong&gt;Delete every template we hold&lt;/strong&gt; and &lt;strong&gt;leaving a shared workspace&lt;/strong&gt; never stop working — nor does withdrawing a workspace, detaching a repository, taking somebody out of one, withdrawing or unlocking a managed setting, or deleting an organization prompt or discarding its draft, which is what stops a lapsed plan from trapping a departed colleague&apos;s access, a colleague&apos;s settings, or a prompt an organization no longer stands behind. Deleting is not part of what a plan buys, so you can erase what we hold, and stop receiving what we send, long after you have stopped paying us. Cancelling cannot trap any of them.&lt;/p&gt;
&lt;p&gt;If you never want an account, nothing in this release asks you to have one. If you never want a plan, nothing you already use asks you to buy one.&lt;/p&gt;
&lt;h2 id=&quot;a-fix-to-how-git-providers-sign-in&quot;&gt;A fix to how git providers sign in&lt;/h2&gt;
&lt;p&gt;The service that completes a GitHub or Bitbucket sign-in accepted a callback address it should have rejected, which meant a crafted link could have sent the resulting token somewhere other than your own machine. Signing in now validates that address properly and always requires the proof-of-origin check that binds the sign-in to the copy of Plexus that started it. Nothing about how you connect a provider changes, and existing connections are unaffected.&lt;/p&gt;
&lt;h2 id=&quot;project-path-settings-now-catch-a-bad-path-when-you-type-it&quot;&gt;Project path settings now catch a bad path when you type it&lt;/h2&gt;
&lt;p&gt;Three settings under Worktrees &amp;amp; hooks name a file or folder inside your project — &lt;strong&gt;Where to create session folders&lt;/strong&gt;, &lt;strong&gt;Files and folders to copy&lt;/strong&gt;, and &lt;strong&gt;Write ports to file&lt;/strong&gt;. Until now Plexus accepted anything you typed and quietly worked around a bad value later: an absolute path or a &lt;code&gt;..&lt;/code&gt; was silently dropped when the session was created, so the folder simply appeared somewhere you did not ask for, long after you had stopped looking at the settings screen.&lt;/p&gt;
&lt;p&gt;These fields now tell you at the moment you save. A path has to stay inside the project, and folders have to be separated with a forward slash — &lt;code&gt;config/local.env&lt;/code&gt;, not &lt;code&gt;config\local.env&lt;/code&gt; — so the same setting means the same thing on Windows, macOS and Linux. Values you already saved are left exactly as they are and keep working; only a new edit is checked.&lt;/p&gt;
&lt;h2 id=&quot;a-profile-picture-and-initials-that-sit-in-the-middle&quot;&gt;A profile picture, and initials that sit in the middle&lt;/h2&gt;
&lt;p&gt;The circle that stands for your Plexus account — in the app bar and on &lt;strong&gt;Settings → My account&lt;/strong&gt; — can now show a picture of your choosing. Press &lt;strong&gt;Add a picture&lt;/strong&gt; on the account page, pick any image, and Plexus crops it to a 128 × 128 square on your own machine before storing it with your account, so the same picture greets you on every machine you sign in on. &lt;strong&gt;Change picture&lt;/strong&gt; and &lt;strong&gt;Remove picture&lt;/strong&gt; are on the same page. An account without a picture keeps its coloured circle with your initials, which are now centred properly: they used to sit a couple of pixels too high.&lt;/p&gt;
&lt;h2 id=&quot;every-dropdown-can-be-searched&quot;&gt;Every dropdown can be searched&lt;/h2&gt;
&lt;p&gt;Every dropdown in the app now opens with a search box at the top, so the branch you want is a few keystrokes away even in a repository with hundreds of them. They still look and work like the dropdowns you know: click one and pick, or start typing straight away — a letter typed on a closed dropdown opens it and starts the search — then use the arrow keys and Enter. That covers the &lt;strong&gt;Project&lt;/strong&gt;, &lt;strong&gt;Template&lt;/strong&gt; and &lt;strong&gt;Base branch&lt;/strong&gt; fields of the &lt;strong&gt;New session&lt;/strong&gt; dialog, a template&apos;s branch fields, and every choice on the Settings pages.&lt;/p&gt;
&lt;h2 id=&quot;fields-you-can-drag-into-a-prompt&quot;&gt;Fields you can drag into a prompt&lt;/h2&gt;
&lt;p&gt;Writing a saved prompt no longer means typing &lt;code&gt;{{name}}&lt;/code&gt; by hand. In the prompt box, each field is now a small chip. Type &lt;code&gt;{&lt;/code&gt; and a list of your fields opens at the cursor. You can also click one of the field chips listed under the prompt, or drag it to where it belongs. If the name you type is not a field yet, the list offers &lt;strong&gt;New field &amp;quot;…&amp;quot;&lt;/strong&gt;, which puts the chip in and adds the field for you. A checkbox goes in as a pair of chips, &lt;strong&gt;if …&lt;/strong&gt; and &lt;strong&gt;end …&lt;/strong&gt;, around the part it switches on and off, and it wraps whatever text you have selected. A chip turns amber when something is wrong with it, such as a name that is not set up as a field, and hovering over it says what.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit as text&lt;/strong&gt; still shows the prompt as plain &lt;code&gt;{{…}}&lt;/code&gt; text, and anything you type or paste in that form turns back into chips. What is saved has not changed, so every template you already have opens as chips as it is.&lt;/p&gt;
&lt;p&gt;The same goes for an organization&apos;s prompts on the web. On the &lt;strong&gt;Prompt library&lt;/strong&gt; page of your account, the prompt box shows its fields as chips. Type &lt;code&gt;{{&lt;/code&gt; or open the &lt;strong&gt;Merge tags&lt;/strong&gt; panel beside it to put one in.&lt;/p&gt;
&lt;h2 id=&quot;a-tidier-prompt-library&quot;&gt;A tidier prompt library&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Settings → Prompts&lt;/strong&gt; now works like a library. Your templates are in a list, and the one you pick opens in the side panel on the right, where you can read it, see its fields and their defaults, and copy it. The editor no longer sits on the page all the time. It appears when you press &lt;strong&gt;New template&lt;/strong&gt; or &lt;strong&gt;Edit&lt;/strong&gt;, with &lt;strong&gt;Save&lt;/strong&gt; and &lt;strong&gt;Cancel&lt;/strong&gt; at the top, and the fields and the preview are side by side as two tabs instead of one long page.&lt;/p&gt;
&lt;p&gt;In the &lt;strong&gt;New session&lt;/strong&gt; dialog, a template you picked can now be taken off again. Use the &lt;strong&gt;✕&lt;/strong&gt; next to the &lt;strong&gt;Template&lt;/strong&gt; field or &lt;strong&gt;No template&lt;/strong&gt; at the top of its list, without closing the dialog.&lt;/p&gt;
&lt;h2 id=&quot;pasting-a-screenshot-works-on-windows-again&quot;&gt;Pasting a screenshot works on Windows again&lt;/h2&gt;
&lt;p&gt;On Windows, pasting an image into a session — a Snipping Tool capture, say — did nothing. Claude Code on Windows listens for a different key to paste an image than it does on macOS and Linux, and Plexus was sending the wrong one. Press &lt;code&gt;Ctrl+V&lt;/code&gt; in the Agent tab with an image on the clipboard and it lands in the prompt as an attachment, the same as on every other platform.&lt;/p&gt;
&lt;h2 id=&quot;the-project-git-tab-puts-the-graph-first&quot;&gt;The project Git tab puts the graph first&lt;/h2&gt;
&lt;p&gt;The project&apos;s &lt;strong&gt;Git&lt;/strong&gt; tab has been rebuilt around the commit graph, which now takes the whole width of the tab instead of sharing it with two side panels.&lt;/p&gt;
&lt;p&gt;Your branches, remotes, worktrees, stashes and tags moved to a slim rail on the left that shows how many of each there are. Click one to slide the &lt;strong&gt;References&lt;/strong&gt; panel out at that section, or pin it to keep it beside the graph. A dot on &lt;strong&gt;Worktrees&lt;/strong&gt; tells you when an agent in one of your sessions is working (green) or needs you (amber).&lt;/p&gt;
&lt;p&gt;Clicking a commit slides its details in from the right, over the graph. Click another commit and the details change in place. Click a file and its diff opens on top, with the commit&apos;s file list still showing at its edge, so one click takes you back. &lt;strong&gt;Escape&lt;/strong&gt; closes one layer at a time, and the graph underneath never moves, so you never lose your place in the history. Use the arrow keys (or &lt;code&gt;j&lt;/code&gt; and &lt;code&gt;k&lt;/code&gt;) to move through the graph and &lt;strong&gt;Enter&lt;/strong&gt; to open the selected commit.&lt;/p&gt;
&lt;p&gt;The graph itself is easier to follow. Lines run straight and turn once, with a rounded corner, where they meet another line. Every branch has a clear color of its own, and its label is tinted to match, so you can tell which line a name belongs to. Each commit shows its author&apos;s picture in a ring of its branch&apos;s color. Your uncommitted work is a dotted circle on the branch you are about to commit to.&lt;/p&gt;
&lt;p&gt;You can also see your agents in the graph. A branch a session is working on shows what that session is doing, such as &lt;strong&gt;Working&lt;/strong&gt; or &lt;strong&gt;Needs you&lt;/strong&gt;, next to its label, with a ring of the same color on its newest commit. Commits that arrive while you are watching slide in at the top and stay highlighted until you look at them. If you have scrolled away, a button tells you how many new commits there are and takes you back to them. A thin strip along the right edge marks the checked-out commit, your sessions, new commits and your selection, so you can jump to any of them with one click.&lt;/p&gt;
&lt;h2 id=&quot;a-redesigned-account-panel-on-the-web&quot;&gt;A redesigned account panel on the web&lt;/h2&gt;
&lt;p&gt;The account panel in your browser has a new look, in light and dark, and it follows your system unless you pick one. The menu now runs across the top: &lt;strong&gt;Dashboard&lt;/strong&gt;, &lt;strong&gt;Organizations&lt;/strong&gt;, &lt;strong&gt;Billing&lt;/strong&gt; and &lt;strong&gt;Signed-in devices&lt;/strong&gt;, with your name in the corner.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Dashboard&lt;/strong&gt; now shows four things at a glance: your plan and its next date, the machines signed in to your account, the organizations you belong to with your role in each, and whether two-factor sign-in is on. Each one links to the page where you change it.&lt;/p&gt;
&lt;p&gt;An organization&apos;s &lt;strong&gt;Members&lt;/strong&gt; page opens with how many seats are handed out against how many are paid for. Giving or taking back a seat stays on each person&apos;s row, and &lt;strong&gt;Change roles&lt;/strong&gt; and &lt;strong&gt;Remove&lt;/strong&gt; are now in the &lt;strong&gt;⋯&lt;/strong&gt; menu beside it. On the &lt;strong&gt;Billing&lt;/strong&gt; pages your plan and your billing details sit side by side, with the invoices underneath. The sign-in pages, the screen that confirms a new machine and the invitation pages all match.&lt;/p&gt;
&lt;p&gt;Nothing was renamed: every page, button and field keeps its name and does what it did.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v0.20.2 — Windows sessions start, and consoles close</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v0.20.2"/>
    <id>https://runplexus.com/changelog#v0.20.2</id>
    <published>2026-08-19T00:00:00Z</published>
    <updated>2026-08-19T00:00:00Z</updated>
    <summary>Two Windows fixes that turn out to be the same bug seen from opposite ends. A session could refuse to start — a blinking cursor, then &quot;Claude didn&apos;t start — it launched but produced no output, and an automatic retry didn&apos;t help either.&quot; And every terminal Plexus opened left its Windows console process behind when it closed, some of them spinning a CPU core for as long as the app stayed open. One report had 23 of those alive after a day of use, burning 85 CPU-hours between them while Plexus itself sat idle. There are fixes in here that are not Windows ones either: the review-and-fix cycle no longer marks findings as done when its agent never ran, and pull request comments you send to the agent can always be sent again.</summary>
    <content type="html">&lt;p&gt;Two Windows fixes that turn out to be the same bug seen from opposite ends. A session could refuse to start — a blinking cursor, then &lt;strong&gt;&amp;quot;Claude didn&apos;t start — it launched but produced no output, and an automatic retry didn&apos;t help either.&amp;quot;&lt;/strong&gt; And every terminal Plexus opened left its Windows console process behind when it closed, some of them spinning a CPU core for as long as the app stayed open. One report had 23 of those alive after a day of use, burning 85 CPU-hours between them while Plexus itself sat idle. There are fixes in here that are not Windows ones either: the review-and-fix cycle no longer marks findings as done when its agent never ran, and pull request comments you send to the agent can always be sent again.&lt;/p&gt;
&lt;h2 id=&quot;sessions-that-never-started&quot;&gt;Sessions that never started&lt;/h2&gt;
&lt;p&gt;A new Windows console asks the terminal it is attached to where the cursor is, and it will not start the program inside it until something answers. Plexus answered from its terminal view, which meant the answer could be missed entirely — and when it was missed, that session was stuck for good. Resuming again started a fresh console with the same problem, which is why Retry did not help.&lt;/p&gt;
&lt;p&gt;Plexus now answers immediately, in the same place it reads the console&apos;s output, before any of the app&apos;s own machinery is involved. It was never a problem with your Claude installation, and nothing about that installation needed fixing.&lt;/p&gt;
&lt;p&gt;The review-and-fix cycle&apos;s background agent could never answer at all — its terminal is deliberately read-only — so its rounds are covered by the same change.&lt;/p&gt;
&lt;h2 id=&quot;a-review-round-that-didnt-run-keeps-its-comments&quot;&gt;A review round that didn&apos;t run keeps its comments&lt;/h2&gt;
&lt;p&gt;The review-and-fix cycle marked the comments it handed to a round as resolved the moment it launched the fix agent — about a minute before it could tell whether that agent had started at all. So when one didn&apos;t start, the round&apos;s findings were struck through anyway: the Review tab read as though there was nothing left to do, &lt;strong&gt;Send N comments to agent&lt;/strong&gt; greyed out, and the per-file counts showed a tally of work that never happened.&lt;/p&gt;
&lt;p&gt;A round now resolves its comments only once it has actually run. If the fix agent never started, the comments stay open and the next round hands them over again — so a cycle that stopped early leaves you exactly where you were, with every finding still there to act on.&lt;/p&gt;
&lt;h2 id=&quot;the-fix-agent-says-when-there-is-too-much-to-send-it&quot;&gt;The fix agent says when there is too much to send it&lt;/h2&gt;
&lt;p&gt;There is a limit to how much text can be handed to a program when it starts, and a cycle with a lot of open comments could exceed it. What came back was the operating system&apos;s own wording — &lt;em&gt;&amp;quot;The filename or extension is too long.&amp;quot;&lt;/em&gt; — attached to a failed cycle, which explained nothing.&lt;/p&gt;
&lt;p&gt;Plexus now checks first and says what is wrong: how much there is, what the limit is, and that resolving or deleting some comments will let the cycle run. It never sends a shortened version of your comments, because an agent working from half a list is worse than one that didn&apos;t start.&lt;/p&gt;
&lt;h2 id=&quot;consoles-are-closed-when-a-terminal-closes&quot;&gt;Consoles are closed when a terminal closes&lt;/h2&gt;
&lt;p&gt;Stopping a session, switching away from one, closing a scratch terminal or finishing a review round now releases the Windows console that terminal was using, instead of leaving it running until you quit the app.&lt;/p&gt;
&lt;p&gt;Switching between sessions was the quietest source of this. Plexus keeps a limited number of sessions warm and stops the least recently used one beyond that, so simply moving around a project with more sessions than the warm limit leaked a console each time — with nothing on screen to suggest it.&lt;/p&gt;
&lt;p&gt;If you have been hitting this, you do not need to do anything after updating: the leftovers from earlier runs are gone the next time you quit and reopen Plexus.&lt;/p&gt;
&lt;h2 id=&quot;a-terminal-that-fails-to-open-is-retried&quot;&gt;A terminal that fails to open is retried&lt;/h2&gt;
&lt;p&gt;If building a terminal failed once, Plexus remembered the failure and reused it for every terminal afterwards, for as long as the app stayed open. Every session opened from that point on got no terminal — and on Windows, a session with no terminal was a session that could not start. Plexus now retries instead of caching the failure.&lt;/p&gt;
&lt;h2 id=&quot;sessions-that-fail-to-start-no-longer-leave-an-agent-behind&quot;&gt;Sessions that fail to start no longer leave an agent behind&lt;/h2&gt;
&lt;p&gt;If the last step of starting or resuming a session failed, Plexus could return an error while the agent it had just launched kept running — with no way for you to see or stop it. That agent is now stopped as part of the failure.&lt;/p&gt;
&lt;h2 id=&quot;diagnostic-logs-stay-a-sensible-size-and-stay-readable&quot;&gt;Diagnostic logs stay a sensible size, and stay readable&lt;/h2&gt;
&lt;p&gt;Three fixes to the log behind &lt;strong&gt;Settings → Diagnostics&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;It could grow without limit inside a single run — one report arrived at 179 MB — because the clean-up on start-up skipped any file whose oldest line was still inside the retention window, which is always true of a file something is actively filling. Oversized logs are now trimmed to their most recent portion regardless of age.&lt;/li&gt;&lt;li&gt;A session that failed to start wrote a warning about it every two seconds for as long as the app stayed open, which is what filled those logs. That warning is now capped, so the log keeps the part that explains the problem instead of burying it.&lt;/li&gt;&lt;li&gt;Lines written at the same moment from different parts of the app could interleave, splicing two entries into one unreadable line. Each entry is now written in one piece.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Setting &lt;strong&gt;Delete diagnostic logs after (days)&lt;/strong&gt; to &lt;code&gt;0&lt;/code&gt; still keeps everything, and a log you pointed Plexus at yourself with &lt;code&gt;PLEXUS_DIAG&lt;/code&gt; is still never touched.&lt;/p&gt;
&lt;h2 id=&quot;pull-request-comments-you-can-always-send-again&quot;&gt;Pull request comments you can always send again&lt;/h2&gt;
&lt;p&gt;Handing a PR review comment to the agent marks it &lt;strong&gt;Sent&lt;/strong&gt; so you don&apos;t send it twice. That mark now lasts only as long as the agent that received it. Stop the session, resume it, or lose the agent to a crash, and every comment it was given goes back to being sendable — because a prompt written to a terminal that is no longer there was never read by anybody.&lt;/p&gt;
&lt;p&gt;Before, the mark lasted for as long as Plexus was open. A send into a session whose agent was not actually running still counted, so the comments were left chipped &lt;strong&gt;Sent&lt;/strong&gt;, the button that sends them all disappeared, and restarting Plexus was the only way back.&lt;/p&gt;
&lt;p&gt;That button also stays on screen now instead of vanishing once everything has been sent. It goes quiet and says what it is waiting for, rather than leaving you looking for a control that isn&apos;t there.&lt;/p&gt;
&lt;p&gt;If you have &lt;strong&gt;Resolve PR comments after the agent fixes them&lt;/strong&gt; turned on, it is held to the same rule: a comment is only resolved on GitHub or Bitbucket if the agent that was actually given it finishes the turn. A resume no longer resolves comments that agent never saw.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v0.20.0 — Send feedback, and open your dev server from the session</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v0.20.0"/>
    <id>https://runplexus.com/changelog#v0.20.0</id>
    <published>2026-08-16T00:00:00Z</published>
    <updated>2026-08-16T00:00:00Z</updated>
    <summary>Plexus can now hear back from you. There is a Feedback button in the app bar, the diagnostic log finally stops growing forever, a session&apos;s dev server is one click away from its tab strip, a session whose pull request has merged cleans itself up without stopping to ask, and a session that has handed its work to subagents says so rather than asking for you. And on Windows, two things that never worked on an npm install of Claude Code now do: every AI feature, and starting a session at all when your user name has a space in it.</summary>
    <content type="html">&lt;p&gt;Plexus can now hear back from you. There is a &lt;strong&gt;Feedback&lt;/strong&gt; button in the app bar, the diagnostic log finally stops growing forever, a session&apos;s dev server is one click away from its tab strip, a session whose pull request has merged cleans itself up without stopping to ask, and a session that has handed its work to subagents says so rather than asking for you. And on Windows, two things that never worked on an npm install of Claude Code now do: every AI feature, and starting a session at all when your user name has a space in it.&lt;/p&gt;
&lt;h2 id=&quot;send-feedback&quot;&gt;Send feedback&lt;/h2&gt;
&lt;p&gt;Next to the search field there is now a &lt;strong&gt;Feedback&lt;/strong&gt; button. Write whatever you want — a bug, a missing feature, something that annoys you — and it reaches us directly. No account, no issue tracker, no signing up.&lt;/p&gt;
&lt;p&gt;Because Plexus is local-first, this is the one place where something you made can leave your machine, so the dialog is built around showing you exactly what that is. Nothing is sent until you press Send, and nothing is sent that the dialog did not put in front of you first.&lt;/p&gt;
&lt;h3 id=&quot;what-you-can-attach&quot;&gt;What you can attach&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;A screenshot&lt;/strong&gt;, only if you press &lt;strong&gt;Attach screenshot&lt;/strong&gt;. It is a picture of the Plexus window drawn by Plexus itself, not a capture of your screen — it cannot contain another application, a second monitor, or anything behind the window, and Plexus never asks macOS for screen-recording permission. You see it before you send, and you can remove it again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diagnostic logs&lt;/strong&gt;, on by default, with a &lt;strong&gt;Preview what&apos;s included&lt;/strong&gt; panel that prints the exact text that will be uploaded. Anything shaped like a token, key or password is blanked out before it leaves your machine, and your home folder and username are rewritten. What it keeps — deliberately, because it is what makes the log useful — is repository paths, branch names, worktree folders, session ids and timings.&lt;/p&gt;
&lt;p&gt;If Diagnostic logging is switched off, Plexus says so, still attaches the activity trail it keeps in memory, and offers to turn logging on — while being honest that it starts recording from that moment and will not help the report you are writing.&lt;/p&gt;
&lt;p&gt;Your email address is optional and blank unless you type it. Without it we simply cannot reply.&lt;/p&gt;
&lt;h3 id=&quot;deleting-a-report&quot;&gt;Deleting a report&lt;/h3&gt;
&lt;p&gt;Every report comes back with a reference code, which Plexus keeps in a list on your device. Mail that code to &lt;a href=&quot;mailto:timo@codedwords.com&quot;&gt;timo@codedwords.com&lt;/a&gt; and we delete the report and everything attached to it. Screenshots and logs are deleted automatically after 90 days in any case, and the message itself after a year.&lt;/p&gt;
&lt;p&gt;Full details of what is and is not sent are at &lt;a href=&quot;https://runplexus.com/docs/feedback&quot;&gt;https://runplexus.com/docs/feedback&lt;/a&gt; and in the Privacy Policy.&lt;/p&gt;
&lt;h2 id=&quot;diagnostic-logs-stop-growing-forever&quot;&gt;Diagnostic logs stop growing forever&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;plexus-diag.log&lt;/code&gt; used to be appended to and never trimmed. Now every launch drops lines older than seven days.&lt;/p&gt;
&lt;p&gt;You can change that with &lt;strong&gt;Delete diagnostic logs after (days)&lt;/strong&gt; under Settings → Advanced — set it to &lt;code&gt;0&lt;/code&gt; to keep everything, which is what you want when you are capturing a problem that only reappears every few weeks. A log file you pinned yourself with the &lt;code&gt;PLEXUS_DIAG&lt;/code&gt; environment variable is never touched.&lt;/p&gt;
&lt;p&gt;Diagnostic logging itself is still off by default, and still writes nothing until you turn it on.&lt;/p&gt;
&lt;h2 id=&quot;open-the-sessions-dev-server&quot;&gt;Open the session&apos;s dev server&lt;/h2&gt;
&lt;p&gt;Every session gets its own block of ten localhost ports, and the first of them — the one your
dev server should be listening on — used to be a small grey number on the session&apos;s sidebar row
and in the header bar. A number you could read, in two places you could not do anything with it.&lt;/p&gt;
&lt;p&gt;It has moved to where it is useful. Open a session and its tab strip now carries an &lt;strong&gt;Open
localhost:20030&lt;/strong&gt; button, beside &lt;strong&gt;Hook output&lt;/strong&gt;. Click it and your browser opens at that port.
The caret next to it holds &lt;strong&gt;Copy port&lt;/strong&gt; and &lt;strong&gt;Reassign ports&lt;/strong&gt;, so nothing about a session&apos;s
ports asks you to leave the session any more. In Compact the label shortens to
&lt;code&gt;localhost:20030&lt;/code&gt;, and on a narrow pane it drops to the icon, so the tabs beside it stay
reachable however far you drag the sidebar over. Hover it and the tooltip names the whole block,
ports 20030 through 20039.&lt;/p&gt;
&lt;p&gt;The button is there when the session holds a block and &lt;strong&gt;Assign dev server ports&lt;/strong&gt; is on for
that project — and it goes the moment you switch that setting off, with no restart. It is never
shown greyed out: a session that has never started holds no ports, and there is nothing you
could press to give it some.&lt;/p&gt;
&lt;p&gt;The dashboard keeps its port chip. That screen has no session tab strip to put a button in, and
it is the one place you compare one session&apos;s ports against another&apos;s. The &lt;code&gt;⋯&lt;/code&gt; menu on every
session row, in the sidebar and on the dashboard alike, still carries the same three port
actions it always did.&lt;/p&gt;
&lt;p&gt;One thing worth knowing now that reassigning is a click away: it does not move a dev server that
is already running. The port variables are handed to what Plexus starts, at the moment it starts
it, so a server your run hook launched keeps listening where it was told to while the button
already names the new block. Reassign while the session is stopped, or restart it afterwards.&lt;/p&gt;
&lt;p&gt;Full details are at &lt;a href=&quot;https://runplexus.com/docs/worktrees#dev-server-ports&quot;&gt;https://runplexus.com/docs/worktrees#dev-server-ports&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;cleanup-after-a-merge-no-longer-asks&quot;&gt;Cleanup after a merge no longer asks&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Clean up a session when its pull request is merged&lt;/strong&gt; has always described something Plexus
did not quite do. It said it would remove the session automatically; what it actually did was
wait until a background check noticed the merge — sometimes a minute after somebody else
pressed the button — and then open a confirmation dialog in front of whatever you were doing.&lt;/p&gt;
&lt;p&gt;That dialog is gone. If you switched the setting on, that was the answer. Plexus now cleans
the session up on its own, with no interruption, and tells you afterwards what it did.&lt;/p&gt;
&lt;p&gt;It still follows your &lt;strong&gt;When you remove a session&lt;/strong&gt; setting, so &lt;strong&gt;Archive (keep a
restorable copy)&lt;/strong&gt; files the session away and leaves everything on disk. The one change is
&lt;strong&gt;Ask each time&lt;/strong&gt;: there is nobody to ask when the trigger is a background check, so it
deletes there, the same as &lt;strong&gt;Delete immediately&lt;/strong&gt;. The setting&apos;s description in Settings →
Git &amp;amp; PRs now says all of this outright.&lt;/p&gt;
&lt;p&gt;Whether the session&apos;s branch goes with it is inherited from the &lt;strong&gt;Also delete the local
branch&lt;/strong&gt; switch in the ordinary removal dialog — the one you last used when removing a
session by hand. That switch starts off, so branches are kept until you have ticked it at
least once. A branch that existed before the session, one you started work on rather than
one Plexus cut, is always kept: deleting somebody else&apos;s branch is not a decision Plexus
will make while you are not looking.&lt;/p&gt;
&lt;h3 id=&quot;only-a-merge-plexus-watched&quot;&gt;Only a merge Plexus watched&lt;/h3&gt;
&lt;p&gt;The cleanup runs for a pull request Plexus saw while it was open. One that was opened and
merged entirely between two checks — or that Plexus is meeting for the first time already
merged — is left alone. Removing a worktree cannot be undone, so it is not something to do
on the strength of a status just seen for the first time.&lt;/p&gt;
&lt;h3 id=&quot;several-at-once&quot;&gt;Several at once&lt;/h3&gt;
&lt;p&gt;If more than one session&apos;s pull request has merged, all of them are cleaned up now, one
after another. Previously only the last one got its dialog and the rest were quietly
skipped, which is why a merged session sometimes stayed in the sidebar for no visible
reason.&lt;/p&gt;
&lt;h2 id=&quot;sessions-say-delegating-instead-of-needs-you&quot;&gt;Sessions say &amp;quot;Delegating&amp;quot; instead of &amp;quot;Needs you&amp;quot;&lt;/h2&gt;
&lt;p&gt;A session with background subagents running now says &lt;strong&gt;Delegating&lt;/strong&gt; — in the same blue as the
ring around its dot — whenever its main agent is not mid-turn. It reads that way on the second
line of its sidebar row and in the header bar at Normal density, and in &lt;strong&gt;⌘K&lt;/strong&gt; search, where it
comes with the count: &lt;em&gt;Delegating · 2&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A session whose agent is still working is untouched. That one keeps saying &lt;strong&gt;Working&lt;/strong&gt;, and
&lt;strong&gt;Working · 2 delegating&lt;/strong&gt; in search, because the main agent being busy is the more useful half
of that answer.&lt;/p&gt;
&lt;p&gt;Before this, the same session said &lt;strong&gt;Needs you&lt;/strong&gt; in amber, or &lt;strong&gt;Idle&lt;/strong&gt; — and amber reads as a
call to action for a session where the agent has handed work off and the delegated work is what
is still running. The rest of the app had already decided that isn&apos;t a moment worth pulling you
in for: a turn that ends with subagents still going gets no chime and no notification. The word
was the last surface still calling you over.&lt;/p&gt;
&lt;p&gt;One thing worth knowing, because the word alone won&apos;t tell you: a session paused on a permission
prompt, a plan waiting for approval or a question also reads &lt;strong&gt;Delegating&lt;/strong&gt; while the ring is
lit. The tell is the dot, which is deliberately unchanged — it stays amber, and hovering it
still says &lt;em&gt;Waiting for input — 2 subagents running&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Nothing else moves. The dot, the ring, the tooltip and every &amp;quot;N delegating&amp;quot; count are exactly as
they were.&lt;/p&gt;
&lt;h2 id=&quot;ai-features-on-a-windows-npm-install&quot;&gt;AI features on a Windows npm install&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Run AI review&lt;/strong&gt;, the AI &lt;strong&gt;pull request title and description&lt;/strong&gt;, &lt;strong&gt;session summaries&lt;/strong&gt; and
every round of the &lt;strong&gt;review-and-fix cycle&lt;/strong&gt; now work on an npm or Volta install of Claude
Code, on Windows, with nothing for you to change. No setting, no reinstall.&lt;/p&gt;
&lt;p&gt;They had never worked there. Plexus handed Claude its instructions on the command line, and
on Windows an npm install of Claude Code is a small &lt;code&gt;claude.cmd&lt;/code&gt; script that Windows runs
through the command prompt — which cannot carry a line break inside a command-line argument
at all. Every one of those instructions is more than one line long, so each of those features
failed every single time, before Claude was even started. AI commit messages were the one
exception, and only because their instruction happens to fit on a single line.&lt;/p&gt;
&lt;p&gt;Plexus now sends the instruction to Claude the same way it has always sent the diff or the
transcript that goes with it: through the program&apos;s input rather than its command line. That
is the case on macOS and Linux too, not only on Windows — one route everywhere, so this is
not a special case that only breaks again somewhere nobody looks. What the agent is asked for
is unchanged, word for word.&lt;/p&gt;
&lt;p&gt;The review-and-fix agent runs in a terminal of its own and has no such input to write to, so
on those installs Plexus hands it a file holding the instructions instead. That one is the
only part of this that is Windows-specific: for the fix agent, native installs of Claude Code
and every install on macOS and Linux take exactly the route they always did.&lt;/p&gt;
&lt;p&gt;If Plexus does still refuse an argument on Windows — a session name containing a character
the command prompt would treat as punctuation, for instance — the message now tells you what
to do about it. It leads with &lt;code&gt;claude install&lt;/code&gt;, the Claude Code command that replaces an npm
install with the native build without opening a browser, and offers the PowerShell one-liner
&lt;code&gt;irm https://claude.ai/install.ps1 | iex&lt;/code&gt; beside it. The old message pointed at a page that
answers with an error.&lt;/p&gt;
&lt;h2 id=&quot;sessions-start-when-your-windows-user-name-has-a-space-in-it&quot;&gt;Sessions start when your Windows user name has a space in it&lt;/h2&gt;
&lt;p&gt;A second Windows bug, found while fixing the first, and unrelated to AI features: if the
path to your &lt;code&gt;claude.cmd&lt;/code&gt; contained a space, starting a session did not work at all. That is
not an exotic case — a Windows profile named &lt;code&gt;First Last&lt;/code&gt; puts a space in the npm install
path, and so does any install under &lt;code&gt;C:\Program Files&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Plexus runs a &lt;code&gt;claude.cmd&lt;/code&gt; through the Windows command prompt, and a quoted path at the very
start of that command was being taken apart by the command prompt&apos;s own quote handling
before it ever ran. The command is now written so that cannot happen. Nothing about your
setup needs to change.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v0.19.0 — Appearance settings, two interface modes, and one header per window</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v0.19.0"/>
    <id>https://runplexus.com/changelog#v0.19.0</id>
    <published>2026-08-14T00:00:00Z</published>
    <updated>2026-08-14T00:00:00Z</updated>
    <summary>Plexus has always had exactly one look, and it was the tightest one — built for the moment
you have five to ten sessions live and every pixel is signal. That is still there, and it is
still what Compact means. But it is no longer the only answer, and it is no longer something
you have to accept silently.</summary>
    <content type="html">&lt;p&gt;Plexus has always had exactly one look, and it was the tightest one — built for the moment
you have five to ten sessions live and every pixel is signal. That is still there, and it is
still what Compact means. But it is no longer the only answer, and it is no longer something
you have to accept silently.&lt;/p&gt;
&lt;p&gt;Settings has a new Appearance page. Theme moves there from the title-bar button — including
&amp;quot;match my operating system&amp;quot;, which the button could take you out of but never back into.
Beside it are two new choices about the shape of the app itself.&lt;/p&gt;
&lt;h2 id=&quot;appearance-settings&quot;&gt;Appearance settings&lt;/h2&gt;
&lt;p&gt;Settings → Appearance. Three preferences, each shown as a pair of cards with a small diagram
of the layout it produces, so you can see the difference before you commit to it.&lt;/p&gt;
&lt;p&gt;These are per-machine preferences. Unlike everything else in Settings they are never
inherited by a workspace or project, and they will not appear on a project&apos;s own settings
page — how Plexus looks on this laptop is not a property of your repository.&lt;/p&gt;
&lt;h3 id=&quot;theme&quot;&gt;Theme&lt;/h3&gt;
&lt;p&gt;Light, Dark, and Match system, which is what a new install uses. The title-bar toggle stays
as a shortcut between light and dark; the page is where you get back to following the OS.&lt;/p&gt;
&lt;h2 id=&quot;compact-and-normal&quot;&gt;Compact and Normal&lt;/h2&gt;
&lt;p&gt;Density is a layout mode, not a spacing slider. Each one changes what a session row &lt;strong&gt;is&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compact&lt;/strong&gt; is one 28px line per session: the name, a coloured dot for the agent&apos;s state, and
the pull-request icon. It is the layout Plexus shipped with, unchanged.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Normal&lt;/strong&gt; — the new default — gives a session two lines. The second one names the branch it
is on and says what the agent is doing in words: Working, Needs you, Idle.&lt;/p&gt;
&lt;p&gt;The glyph beside that branch name does two jobs at once. Its shape tells you where the branch
came from: a branch Plexus cut for the session, or a link for one it attached to — which is
what you want to spot before a rebase rewrites history someone else may already have. Its
colour is the pull request: grey when there is none, green when one is open, purple once it
is merged. Click it to open the PR.&lt;/p&gt;
&lt;p&gt;The row&apos;s &lt;code&gt;⋯&lt;/code&gt; menu no longer holds a place for itself while it is hidden, so the session name
and the state word run to the edge of the sidebar instead of stopping short of it. The menu
appears over that edge when you hover the row.&lt;/p&gt;
&lt;p&gt;Switch between them from the app bar, or from Settings → Appearance.&lt;/p&gt;
&lt;p&gt;The session and project tabs changed with them: the active tab is now marked by
a brand underline along the bottom of the strip rather than a filled chip, and
each tab carries its own glyph.&lt;/p&gt;
&lt;h2 id=&quot;one-active-workspace&quot;&gt;One active workspace&lt;/h2&gt;
&lt;p&gt;The sidebar used to nest three levels: workspace, then project, then session. It now shows
one workspace at a time, chosen from a switcher in the app bar — so a project is the first
thing in the sidebar and a session is one step in, with no chain of chevrons to open before
you reach the thing you wanted.&lt;/p&gt;
&lt;p&gt;The switcher&apos;s menu lists every workspace with its session count and, in amber, how many are
waiting on you. That is the question you switch workspaces to answer, so it is visible before
you switch rather than after.&lt;/p&gt;
&lt;p&gt;Under that list are the active workspace&apos;s own actions — Edit, Settings, Set as default and
Delete workspace. With one workspace shown at a time there is no workspace row in the sidebar
to hang them on, so this menu is where they live.&lt;/p&gt;
&lt;p&gt;Prefer the old tree? Settings → Appearance → Workspace navigation → &lt;strong&gt;All workspaces in the
sidebar&lt;/strong&gt; brings all three levels back — and it is easier to read than it was. Each workspace
is now drawn as a group: a header that stays put while its projects scroll past, over a well
with a rail down its left edge, so you can see where one workspace ends and the next begins
instead of counting indentation. The workspace holding whatever you have open is tinted, and
nothing is tinted when nothing is open.&lt;/p&gt;
&lt;p&gt;Project rows also gained a standing button for the project view — the dashboard, git client
and terminal — which previously you could only reach by knowing that clicking the row did
something.&lt;/p&gt;
&lt;h2 id=&quot;search-your-sessions&quot;&gt;Search your sessions&lt;/h2&gt;
&lt;p&gt;Press &lt;strong&gt;⌘K&lt;/strong&gt; — Ctrl+K on Windows and Linux — or click the search field in the app bar, and
type. Every session and every project in the tree is there: match on a session&apos;s name, the
branch it is on, the project it belongs to, or the workspace. Two words narrow instead of
widen, so &lt;code&gt;plexus settings&lt;/code&gt; finds the one session you meant.&lt;/p&gt;
&lt;p&gt;Enter opens it. If it lives in a workspace you are not currently looking at, or in a project
that is collapsed, Plexus points the sidebar at it and scrolls the row into view rather than
selecting something you cannot see. With nothing typed you get your whole tree as a flat list,
50 rows at a time — when there are more than that, the bar along the bottom tells you how many. The same is now true of the &lt;strong&gt;Open&lt;/strong&gt; button on a
notification — it used to be able to take you to a row that was nowhere on screen.&lt;/p&gt;
&lt;p&gt;The shortcut works while the agent terminal has focus, which is where it is most useful and
where a shortcut normally stands down. That does mean Ctrl+K no longer reaches the terminal on
Windows and Linux, where it clears to the end of the line; if you want it back, Settings →
Keybindings → &lt;strong&gt;Search sessions and projects&lt;/strong&gt; rebinds or unbinds it. It does stand down for
one thing: another dialog. Opening a search on top of a half-filled New session dialog would
navigate away and leave that dialog stranded over an unrelated session.&lt;/p&gt;
&lt;h2 id=&quot;choose-the-project-when-you-create-a-session&quot;&gt;Choose the project when you create a session&lt;/h2&gt;
&lt;p&gt;The New session dialog inherited its project from wherever you opened it, and the &lt;strong&gt;+&lt;/strong&gt; in the
app bar had to guess — the project you had selected, or the first one in the workspace. When
the guess was wrong the only way out was to close the dialog and start again.&lt;/p&gt;
&lt;p&gt;It now asks. &lt;strong&gt;Project&lt;/strong&gt; is a field in the dialog, prefilled with that same guess and
changeable in one click. It offers what the sidebar offers: the current workspace&apos;s projects,
or every workspace&apos;s grouped by name if you use the &amp;quot;All workspaces in the sidebar&amp;quot; setting.
Open it on a project from another workspace — from a dashboard row — and both are listed under
their names, so the way back is a click rather than a reopen.&lt;/p&gt;
&lt;p&gt;Switching re-reads that repository&apos;s branches and clears the base and branch you had picked —
&lt;code&gt;main&lt;/code&gt; in one repository is not &lt;code&gt;main&lt;/code&gt; in another — while keeping the name you typed. A name
Plexus filled in for you from a branch goes with that branch.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;New branch / Existing branch&lt;/strong&gt; switch is now a segmented control, with the explanation
for whichever mode is selected below it.&lt;/p&gt;
&lt;h2 id=&quot;session-summaries-introduce-themselves&quot;&gt;Session summaries introduce themselves&lt;/h2&gt;
&lt;p&gt;Plexus can keep an AI-written digest of a session — what you asked for, and what the agent has
done about it — refreshed as the agent stops, while you have the panel open on it. It has been
there for a while, switched off by default. The trouble was that the same setting also hid its
button, so the only way to find the feature was to already know it existed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt; is now always in the session header. Open it with summaries switched off and the
panel says what it does and what it costs — each refresh sends that session&apos;s transcript to
the agent and uses one of your plan&apos;s turns — and offers two ways to switch it on: for the
project you are working in, or everywhere. Either way Plexus writes the first summary straight
away rather than leaving you with an empty panel until the agent next stops.&lt;/p&gt;
&lt;p&gt;Nothing is sent anywhere until you press one of those buttons.&lt;/p&gt;
&lt;h2 id=&quot;one-header-per-window&quot;&gt;One header per window&lt;/h2&gt;
&lt;p&gt;The session view and the project view each used to draw their own header inside the right
pane, starting at the sidebar&apos;s edge and repeating what the sidebar already showed. There is
now a single bar across the full width of the window that says where you are — project, then
session, then the agent&apos;s state — and carries the tools that act on it. The pane below it is
just the work.&lt;/p&gt;
&lt;h2 id=&quot;dev-server-ports&quot;&gt;Dev server ports&lt;/h2&gt;
&lt;p&gt;Running two sessions of one repository has always had the same sharp edge: both want to start
the dev server, and the second one finds port 3000 taken. Plexus now hands &lt;strong&gt;every session its
own block of ten localhost ports&lt;/strong&gt; and puts them in the environment of everything it starts for
that session — the agent, the session&apos;s terminal tab, and every lifecycle hook.&lt;/p&gt;
&lt;p&gt;The block is reserved when a session starts, checked to be genuinely free before Plexus commits
to it, and kept for as long as the session&apos;s working copy exists. Resuming gives a session the
same ports it had, so a dev server that is already listening is never moved out from under
itself. Tearing the worktree down releases them.&lt;/p&gt;
&lt;p&gt;Each session&apos;s first port shows as a small chip in three places — its sidebar row, its dashboard
row, and the header bar while it is open. Hover it and the tooltip names the whole range.&lt;/p&gt;
&lt;p&gt;Its &lt;code&gt;⋯&lt;/code&gt; menu, in the sidebar and on the dashboard both, gains three matching actions: &lt;strong&gt;Open
localhost:20030&lt;/strong&gt; launches your browser at that port, &lt;strong&gt;Copy port&lt;/strong&gt; puts the number on the
clipboard, and &lt;strong&gt;Reassign ports&lt;/strong&gt; is covered below. They are absent rather than greyed out for a
session that holds no block, since nothing you could do from that menu would give it one.&lt;/p&gt;
&lt;h3 id=&quot;what-your-scripts-get&quot;&gt;What your scripts get&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;PLEXUS_PORT&lt;/code&gt; is the session&apos;s first port — the one to use. &lt;code&gt;PLEXUS_PORT_BASE&lt;/code&gt; is the same
number for scripts that do arithmetic, &lt;code&gt;PLEXUS_PORT_COUNT&lt;/code&gt; is how many the block holds, and
&lt;code&gt;PLEXUS_PORT_1&lt;/code&gt; through &lt;code&gt;PLEXUS_PORT_9&lt;/code&gt; are the rest of it, for a second server, a test
database or a debugger. &lt;code&gt;PORT&lt;/code&gt; is set too, because that is the name Next.js, Nuxt, Rails and
Express already read.&lt;/p&gt;
&lt;p&gt;The intended home for all of this is a &lt;strong&gt;run&lt;/strong&gt; hook, which fires on every start and resume:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm dev --port $PLEXUS_PORT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Commit that to your repository&apos;s &lt;code&gt;.plexus/hooks.json&lt;/code&gt; and everyone on the team gets it from a
clone.&lt;/p&gt;
&lt;h3 id=&quot;your-dev-server-still-has-to-be-told&quot;&gt;Your dev server still has to be told&lt;/h3&gt;
&lt;p&gt;Plexus sets the variables. It does not inspect your project, does not know which framework you
use, and never adds a flag to a command you wrote. If your server reads &lt;code&gt;PORT&lt;/code&gt; on its own,
there is nothing else to do. &lt;strong&gt;Vite, Astro and Angular do not&lt;/strong&gt; — they need
&lt;code&gt;--port $PLEXUS_PORT&lt;/code&gt; on the command, or the value threaded into their config. And if nothing
in your project reads any of these variables, nothing about your setup changes.&lt;/p&gt;
&lt;h3 id=&quot;one-thing-that-may-change-under-you&quot;&gt;One thing that may change under you&lt;/h3&gt;
&lt;p&gt;Most &lt;code&gt;.env&lt;/code&gt; loaders leave a variable alone when the process already has one. So for a project
whose &lt;code&gt;.env&lt;/code&gt; is copied into each session and carries a &lt;code&gt;PORT=3000&lt;/code&gt; line, that line no longer
wins: Plexus sets &lt;code&gt;PORT&lt;/code&gt; in the environment first, and the loader will not overwrite it. If you
were fixing a port that way — which is exactly what the old documentation suggested — your
server now starts somewhere in the twenty-thousands instead.&lt;/p&gt;
&lt;p&gt;That is usually the outcome you wanted. If it isn&apos;t, open Settings → Worktrees &amp;amp; Hooks and
clear &lt;strong&gt;Extra port variables&lt;/strong&gt;: with the list empty, Plexus sets only its own &lt;code&gt;PLEXUS_PORT*&lt;/code&gt;
names and &lt;code&gt;PORT&lt;/code&gt; is yours again.&lt;/p&gt;
&lt;h3 id=&quot;the-range-and-the-settings-behind-it&quot;&gt;The range, and the settings behind it&lt;/h3&gt;
&lt;p&gt;Blocks come out of &lt;strong&gt;20000–32000&lt;/strong&gt; — around 1200 of them. That window sits above every common
dev-server port, above 10080 (the highest port Chrome and Firefox refuse to open, which would
give you a server that starts fine and a browser that will not load it), and below 32768, where
Linux starts handing the same numbers out to outgoing connections. Move it with &lt;strong&gt;First port&lt;/strong&gt;
and &lt;strong&gt;Last port&lt;/strong&gt; if it clashes with something on your machine.&lt;/p&gt;
&lt;p&gt;All five settings live in Settings → Worktrees &amp;amp; Hooks, globally or per project: &lt;strong&gt;Assign dev
server ports&lt;/strong&gt; (on), &lt;strong&gt;First port&lt;/strong&gt;, &lt;strong&gt;Last port&lt;/strong&gt;, &lt;strong&gt;Extra port variables&lt;/strong&gt;, and &lt;strong&gt;Write ports
to file&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That last one is off by default and covers what environment variables cannot reach — a
&lt;code&gt;docker compose&lt;/code&gt; file reading &lt;code&gt;.env&lt;/code&gt; for substitution, or a server you launch yourself from a
terminal Plexus did not open. Name a file and Plexus keeps a marked block of the same variables
inside it, refreshed every time the session comes back up, with everything outside the markers
left exactly as you wrote it. It is for compose services, database ports and app config. It is not a second way
to move a dev server: Vite, for one, loads &lt;code&gt;.env.local&lt;/code&gt; and still takes its listen port only
from its config or its command line.&lt;/p&gt;
&lt;h3 id=&quot;if-a-port-gets-taken-anyway&quot;&gt;If a port gets taken anyway&lt;/h3&gt;
&lt;p&gt;A reservation is remembered, not re-checked — re-checking it on every resume could move a
running server&apos;s ports out from under it — so something else on your machine can claim one of a
stopped session&apos;s ports while it is down. &lt;strong&gt;Reassign ports&lt;/strong&gt; in that session&apos;s &lt;code&gt;⋯&lt;/code&gt; menu drops
the block and searches again. If nothing has taken the old one after all, you get it back: what
you asked for is a block that works, not a different number.&lt;/p&gt;
&lt;p&gt;Full details, including what the reservation does and does not promise, are at
&lt;a href=&quot;https://runplexus.com/docs/worktrees#dev-server-ports&quot;&gt;https://runplexus.com/docs/worktrees#dev-server-ports&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;watch-the-review-and-fix-cycle-work&quot;&gt;Watch the review-and-fix cycle work&lt;/h2&gt;
&lt;p&gt;A review-and-fix cycle can run for the better part of an hour, and until now the only thing it
told you was &amp;quot;Cycle round 2 — agent applying fixes…&amp;quot;. That sentence is the same on a round that
is editing files and a round that is stuck, which made a long round and a broken one impossible
to tell apart.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Watch agent&lt;/strong&gt; now sits next to &lt;strong&gt;Stop&lt;/strong&gt;, both in the Review tab&apos;s status strip and in the
session header, and only while a cycle is actually running. It opens a panel across the bottom
of the session with two halves. The top is a running account: which round it is on, how many
files the review is reading, when it asked the model, how many comments came back, and how long
each phase took. The bottom is a live terminal on the fix agent itself, so you can watch what it
is editing as it happens.&lt;/p&gt;
&lt;p&gt;The terminal is read-only. You can select and copy from it, but nothing you type reaches the
agent — which also means a stray keystroke can&apos;t interrupt a round that has been going for
twenty minutes. The output never touches disk, and it only reaches the app while the panel is
open; closing it stops the stream at the source rather than just hiding it. Open the panel
part-way through a round and it back-fills the most recent stretch so you aren&apos;t starting from
blank.&lt;/p&gt;
&lt;p&gt;Only the fix half runs in a terminal. During a reviewing phase the panel says so, and the
account above it carries the story instead — with a live clock on the current step, so you can
always see something is moving.&lt;/p&gt;
&lt;h2 id=&quot;rounds-that-dont-idle-and-settings-for-the-rest&quot;&gt;Rounds that don&apos;t idle, and settings for the rest&lt;/h2&gt;
&lt;p&gt;Every headless call Plexus makes — the AI review, session summaries, pull request descriptions,
commit messages — was starting up your configured MCP servers first, waiting for all of them to
connect, and shutting them down again when it finished. None of those features can use an MCP
tool. On a machine with a handful of servers configured that was tens of seconds of waiting per
call, twice per review-and-fix round, for nothing. They are no longer started.&lt;/p&gt;
&lt;p&gt;Three other things on the review path were quietly wrong. It ran in whatever directory Plexus
itself had been launched from rather than the session&apos;s worktree. It had no time limit at all,
so a review that wedged looked exactly like a review that was merely slow, forever — it now
gives up after fifteen minutes and says so, and inside a cycle that just skips the round. And
the fix agent was handed the review comments with nothing telling it to stay on them, so in a
repository whose agent instructions describe a lot of routine upkeep, a round applying six
comments could go and do all of that too.&lt;/p&gt;
&lt;p&gt;The parts that are genuinely a matter of taste are now settings rather than assumptions
(Settings → Git &amp;amp; PRs, overridable per workspace or project). &lt;strong&gt;Model&lt;/strong&gt; and &lt;strong&gt;Effort&lt;/strong&gt; pickers
for the review and, for the first time, for the fix agent — the expensive half, which previously
had no controls whatsoever and silently inherited whatever your Claude Code configuration
resolved to. &lt;strong&gt;Review-and-fix agent instructions&lt;/strong&gt; for what the fix agent is told before the
comments. And &lt;strong&gt;Allow MCP servers in the review-and-fix agent&lt;/strong&gt;, off by default, for the rare
project whose fixes genuinely need one.&lt;/p&gt;
&lt;p&gt;All four model and effort settings default to Automatic, so nothing changes until you choose —
but the new panel reports what each round actually used, which is the part that was invisible
before.&lt;/p&gt;
&lt;h2 id=&quot;a-more-reliable-subagent-ring&quot;&gt;A more reliable subagent ring&lt;/h2&gt;
&lt;p&gt;The blue ring around a session&apos;s dot means the agent handed work to subagents and carried
on without waiting for them. When it appeared it was right — it just did not appear
anywhere near often enough, and once lit it did not always go out again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Work started by a workflow counts now.&lt;/strong&gt; A workflow that fans out to several agents at
once records the fan-out but nothing about the agents themselves, so the ring stayed dark
for exactly the case where the most work is running in parallel. Plexus now follows the
run itself, and those agents light the ring and drop off it as each one finishes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A launch is reported the moment it happens&lt;/strong&gt;, rather than when the session&apos;s conversation
record catches up. Those are usually the same instant, with one exception that made the
ring look unreliable: if the same turn also stopped to ask you a question or to show you a
plan, the record could land after the work had already been reported finished — and the
ring then never appeared at all. Nothing about that was visible from the outside, so the
same action seemed to work sometimes and not others.&lt;/p&gt;
&lt;p&gt;What lights the ring is unchanged. An agent the main agent is sitting and waiting on is the
main agent working, so it stays a plain green dot with no ring; the ring is for work running
beside your session, not work it is blocked on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stopping a session clears it.&lt;/strong&gt; A session stopped in the middle of a delegation kept
pulsing blue until you restarted Plexus. Stopping it — or the agent exiting on its own —
now clears the ring immediately, which is what the documentation has always said happens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And it shows up where sessions are only summarised.&lt;/strong&gt; A collapsed project used to hide
delegated work completely; its row now carries a small ring and the number of sessions
delegating underneath it. The workspace switcher in the app bar does the same for the
workspace you are in, and its menu shows that count per workspace beside the &amp;quot;need you&amp;quot;
one. In &lt;strong&gt;⌘K&lt;/strong&gt; search, a session&apos;s second line spells it out in words — &lt;em&gt;Working · 2
delegating&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A dark ring can now explain itself.&lt;/strong&gt; Turn on &lt;strong&gt;Diagnostic logging&lt;/strong&gt; (Settings →
Advanced) and Plexus records what the session actually delegated to — including the kinds
of agent that deliberately do not light the ring, counted alongside the ones that do. If
your subagents did not show up, that tells you whether Plexus missed them or whether they
were the sort that never lights it, without you having to reproduce anything.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v0.18.0 — An activity dot that works on Windows, published review notes, and comments that delete</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v0.18.0"/>
    <id>https://runplexus.com/changelog#v0.18.0</id>
    <published>2026-08-12T00:00:00Z</published>
    <updated>2026-08-12T00:00:00Z</updated>
    <summary>The notes you leave on a diff line have always been private — written for the agent, kept on
your machine. Sometimes the right reader is a person instead. A note can now be posted to the
session&apos;s pull request as an inline comment on the same line, one at a time or the whole
review at once. And notes finally keep their line breaks, so a paragraph stays a paragraph
wherever it ends up.</summary>
    <content type="html">&lt;p&gt;The notes you leave on a diff line have always been private — written for the agent, kept on
your machine. Sometimes the right reader is a person instead. A note can now be posted to the
session&apos;s pull request as an inline comment on the same line, one at a time or the whole
review at once. And notes finally keep their line breaks, so a paragraph stays a paragraph
wherever it ends up.&lt;/p&gt;
&lt;p&gt;Deleting one of those notes could also do nothing at all, and then insist the note no longer
existed. Both halves of that are fixed.&lt;/p&gt;
&lt;p&gt;Connected accounts got a fix of their own: a Bitbucket connection that was short of a
permission could ask you to reconnect for ever, and now it stops once it has been asked
and answered.&lt;/p&gt;
&lt;p&gt;On some Windows machines the green dot next to a session simply never lit up. The agent was
working perfectly — it just never looked like it, so a wall of sessions gave you nothing to
read and the dashboard was worth no more than a glance at each terminal.&lt;/p&gt;
&lt;p&gt;The cause was a link in the chain nobody could see. Plexus asked Claude Code to report what
your agent was doing by running a small command, and Claude Code hands that command to a
shell — which on Windows is PowerShell unless you happen to have Git Bash installed. There
the report was quietly lost on the way. That is why it broke for some Windows users and not
others, and why nothing anywhere said so.&lt;/p&gt;
&lt;p&gt;Plexus no longer asks a shell. It also no longer depends on those reports arriving at all,
and if something is still wrong there is now a button that tells you which link is broken.&lt;/p&gt;
&lt;h2 id=&quot;publish-a-note-to-the-pull-request&quot;&gt;Publish a note to the pull request&lt;/h2&gt;
&lt;p&gt;Every inline note carries a fourth button next to &lt;strong&gt;Edit&lt;/strong&gt;, &lt;strong&gt;Resolve&lt;/strong&gt; and &lt;strong&gt;Delete&lt;/strong&gt;:
publish it. It posts the note to the session&apos;s pull request as an inline comment on the same
file and line, under your own GitHub or Bitbucket account.&lt;/p&gt;
&lt;p&gt;Plexus asks first. A confirmation shows the note about to go out and names the repository it
is going to, as &lt;code&gt;owner/repo#number&lt;/code&gt; — publishing is public and there is no undo from Plexus,
so the last step is always yours.&lt;/p&gt;
&lt;p&gt;Publishing &lt;strong&gt;consumes&lt;/strong&gt; the note. Once the comment lands, the local copy is deleted and the
pull request&apos;s own thread renders on that line in its place, so there is nothing left in
Plexus to accidentally send twice. To change or remove it afterwards, edit or delete the
comment on GitHub or Bitbucket, the same as any other comment you left there.&lt;/p&gt;
&lt;p&gt;The Review header carries the bulk version — the same confirmation, a button with a count.
It sends the session&apos;s unresolved notes, up to forty at a time; with more than that the dialog
says so (&amp;quot;the first 40 of 57&amp;quot;) rather than quietly leaving the rest behind. Notes whose file
has left the diff are skipped, since there is no line left to anchor them to — which is why
the count can be lower than the one on &lt;strong&gt;Send N comments to agent&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Resolved notes can be published too. &lt;strong&gt;Send N comments to agent&lt;/strong&gt; resolves everything it
sends, and so does each round of the review-and-fix cycle, so the notes worth showing a
reviewer are often exactly the resolved ones.&lt;/p&gt;
&lt;h3 id=&quot;notes-the-ai-review-agent-wrote-say-so&quot;&gt;Notes the AI review agent wrote say so&lt;/h3&gt;
&lt;p&gt;A published note that the AI review agent drafted opens with an italic line, &lt;em&gt;Drafted by the
Plexus review agent.&lt;/em&gt; — someone reading the thread should know which findings came from a
model rather than from you. Notes you wrote yourself go out exactly as written, with no
marker, the same as the line composer&apos;s &lt;strong&gt;Comment on the PR&lt;/strong&gt; always has.&lt;/p&gt;
&lt;h3 id=&quot;when-its-offered-and-what-can-still-refuse-it&quot;&gt;When it&apos;s offered, and what can still refuse it&lt;/h3&gt;
&lt;p&gt;Both buttons appear only once the pull request&apos;s conversation has actually loaded, only while
the pull request&apos;s comments are shown, and only while the pull request is &lt;strong&gt;open&lt;/strong&gt; — a merged
or closed one takes no new comments.&lt;/p&gt;
&lt;p&gt;A line that isn&apos;t part of the pull request&apos;s diff yet is refused by the provider. Plexus keeps
that note and tells you which ones didn&apos;t land, so committing and pushing and trying again is
all it takes. A large batch goes out one comment at a time, paced so the provider doesn&apos;t
rate-limit it halfway through; if it does run into a rate limit or an authentication problem
it stops there and reports the rest as untried, rather than hammering an endpoint that has
already said no.&lt;/p&gt;
&lt;p&gt;And you can stop a batch yourself: while one is running, the header button becomes a &lt;strong&gt;Stop&lt;/strong&gt;.
It stops at the next note — the comment already on its way still lands — and leaves the rest
untouched, so publishing again picks up where it left off.&lt;/p&gt;
&lt;h2 id=&quot;notes-keep-their-line-breaks&quot;&gt;Notes keep their line breaks&lt;/h2&gt;
&lt;p&gt;An inline note used to be flattened into a single line the moment it was saved, which turned a
two-paragraph thought — or an AI review finding with a code block in it — into one long run of
text. It doesn&apos;t any more: paragraphs, nested lists, indented code fences and the alignment
inside them survive being saved, so the Review tab shows you the note you wrote, and so does
the pull request when you publish it. That matters most for a &lt;code&gt;suggestion&lt;/code&gt; block, which the
person reading your comment can apply into the file with one click.&lt;/p&gt;
&lt;p&gt;Two things a saved note still bounds, so no note can pad the rest of itself out of view: a run
of spaces is kept up to 16 columns, and a run of blank lines up to two. A very long note now
scrolls inside its own thread rather than pushing the diff off screen.&lt;/p&gt;
&lt;p&gt;The prompt the agent receives is unchanged: it still gets one line per note, so a long comment
can&apos;t split the instruction it belongs to.&lt;/p&gt;
&lt;h2 id=&quot;reconnect-notices-that-stop-coming-back&quot;&gt;Reconnect notices that stop coming back&lt;/h2&gt;
&lt;p&gt;If your Bitbucket connection was short of a permission — the access to your repositories,
or to pull requests — Plexus asked you to reconnect, then announced &lt;strong&gt;Bitbucket access
restored&lt;/strong&gt; a moment later, then showed the very same notice the next time you searched for
a repository or refreshed a pull request. &lt;strong&gt;Not now&lt;/strong&gt; didn&apos;t end it either: the notice was
back with the next round. Reconnecting never stopped the app asking you to reconnect.&lt;/p&gt;
&lt;p&gt;Behind it was a check being read as an all-clear it was never able to give. Plexus checks
your Bitbucket connection every few hours, but that check can only confirm one thing — that
your workspaces are still visible — because Bitbucket offers no way to ask what else a
connection covers. Passing it was treated as proof that everything was fine, which wiped a
warning about a completely different permission, and wiped the fact that you had put that
warning away.&lt;/p&gt;
&lt;p&gt;A check now clears a warning only when it actually tested the permission the warning is
about. So a notice raised by a real refusal stays up until the refusal stops, &lt;strong&gt;Not now&lt;/strong&gt;
puts it away for good, and the &amp;quot;access restored&amp;quot; message only appears when something really
was restored.&lt;/p&gt;
&lt;p&gt;Three things follow from that:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;When signing in again genuinely can&apos;t help, Plexus says so and stops asking.&lt;/strong&gt; Some
Bitbucket permissions have to be enabled on the Plexus side, where no amount of
re-signing-in will widen them. Once a reconnect has been tried and the access is still
short, Plexus tells you that plainly instead of offering the same button again — and it
now remembers it after a restart, so you don&apos;t walk into the same loop every time you
open the app.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The notice names the permission the way Bitbucket does.&lt;/strong&gt; Bitbucket&apos;s newer permission
names are recognised now, so a notice reads &lt;strong&gt;Account: Read&lt;/strong&gt; — the checkbox as it is
labelled — rather than an internal identifier you&apos;d have to guess at.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A refusal while loading a pull request counts.&lt;/strong&gt; If a provider turned down a
pull-request request because of a missing permission, that could pass without ever
reaching a notice. It now raises the same notice as everything else, against the account
it came from.&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;the-access-each-connection-carries-in-settings-about&quot;&gt;The access each connection carries, in Settings → About&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Settings → About&lt;/strong&gt; now lists every connected account under &lt;strong&gt;Connected accounts&lt;/strong&gt;,
together with the access the provider recorded for it. When Plexus tells you a permission
has to be enabled on our side and asks you to report it, that list is the thing to copy
into the report — until now there was no way to see it from the app at all. A provider that
recorded nothing says so, rather than showing a blank you would read as &amp;quot;no access&amp;quot;.&lt;/p&gt;
&lt;h2 id=&quot;deleting-an-inline-comment&quot;&gt;Deleting an inline comment&lt;/h2&gt;
&lt;p&gt;Clicking the trash icon on an inline comment in the &lt;strong&gt;Review&lt;/strong&gt; tab could leave the comment
sitting exactly where it was, with no error and no sign anything had happened. Clicking it a
second time then said &lt;code&gt;not found: review comment 3&lt;/code&gt; — and the comment &lt;em&gt;still&lt;/em&gt; stayed on
screen. The frustrating part was invisible: the first click had already deleted it. The list
you were looking at had simply put it back.&lt;/p&gt;
&lt;p&gt;It deletes on the first click now, and stays deleted — through a tab switch, and through
quitting and reopening Plexus.&lt;/p&gt;
&lt;p&gt;Two things caused a comment to come back. Plexus matched a comment by its number alone, and
those numbers get reused after you delete a session, so a comment could be matched against a
long-gone comment from a session you had already thrown away. And re-reading the comment list
in the background could overwrite a comment you had just deleted with an older copy of the
list. Neither can happen now: a comment is only ever matched inside the session it belongs to,
and a list that was read before your change is discarded rather than applied on top of it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Resolve&lt;/strong&gt; and &lt;strong&gt;Edit&lt;/strong&gt; were affected by the same matching fault and are fixed with it — they
could silently apply to the wrong copy of a comment, so the strikethrough or the new text only
showed up after you left the &lt;strong&gt;Review&lt;/strong&gt; tab and came back.&lt;/p&gt;
&lt;p&gt;Deleting a comment that is already gone is no longer reported as an error. It is what you
asked for, so the comment simply disappears.&lt;/p&gt;
&lt;p&gt;While a change to a comment is still being saved — a delete, a resolve or an edit — that
comment&apos;s buttons are greyed out. A second click can&apos;t land on a comment that is already on its
way out, and two quick clicks on &lt;strong&gt;Resolve&lt;/strong&gt; can no longer race each other into leaving the row
showing the opposite of what was saved.&lt;/p&gt;
&lt;h2 id=&quot;comments-from-a-deleted-session-no-longer-show-up-under-a-new-one&quot;&gt;Comments from a deleted session no longer show up under a new one&lt;/h2&gt;
&lt;p&gt;Deleting a session left its inline comments in memory. Because Plexus reuses the internal
numbering of deleted sessions, a session created afterwards could show the deleted session&apos;s
comments in its &lt;strong&gt;Review&lt;/strong&gt; tab until you switched tabs. They are now cleared along with the
rest of the session&apos;s state when it is deleted.&lt;/p&gt;
&lt;p&gt;A change you made just before deleting a session can no longer land in the session that
inherits its number either, which could otherwise leave a comment in a brand-new session&apos;s
&lt;strong&gt;Review&lt;/strong&gt; tab that had never been written there.&lt;/p&gt;
&lt;h2 id=&quot;the-first-comment-on-a-file-appears-immediately&quot;&gt;The first comment on a file appears immediately&lt;/h2&gt;
&lt;p&gt;Adding the very first comment to a session — before Plexus had finished reading that session&apos;s
existing comments — could leave it invisible until something else redrew the diff. It shows up
as soon as you add it.&lt;/p&gt;
&lt;p&gt;Commenting during that same moment could also hide the comments that were &lt;em&gt;already&lt;/em&gt; there:
Plexus discards a comment list it read before your change, and it now reads a fresh one instead
of waiting for the next time you open the &lt;strong&gt;Review&lt;/strong&gt; tab.&lt;/p&gt;
&lt;h2 id=&quot;sessions-on-windows-show-what-the-agent-is-doing&quot;&gt;Sessions on Windows show what the agent is doing&lt;/h2&gt;
&lt;p&gt;Plexus now has Claude Code report activity directly, with no command and no shell in between
— so there is nothing left to lose the message. Working, waiting for you, plan-mode pauses
and the background-subagent ring all behave on Windows the way they always have on macOS and
Linux.&lt;/p&gt;
&lt;p&gt;If you are running an older Claude Code, Plexus keeps using the previous method, which is
unchanged. Updating Claude Code is worth it on Windows.&lt;/p&gt;
&lt;h2 id=&quot;the-dot-keeps-working-even-when-the-reports-dont&quot;&gt;The dot keeps working even when the reports don&apos;t&lt;/h2&gt;
&lt;p&gt;The activity dot used to be entirely dependent on those reports. If none arrived — an old
Claude Code, a policy that blocks them, a broken &lt;code&gt;PATH&lt;/code&gt; — the dot was simply dead, and a
session that ran a tool could get stuck showing green forever, with &lt;strong&gt;Reset status&lt;/strong&gt; the only
way out.&lt;/p&gt;
&lt;p&gt;Now, when a session has gone a while without a single report, Plexus falls back to reading
the agent&apos;s own conversation record instead. It turns green while the agent is writing and
goes back to amber when the turn ends — including for turns that use no tools at all, which
the old behaviour could never show. A session that was interrupted mid-tool now returns to
amber on its own instead of pulsing green until you notice.&lt;/p&gt;
&lt;p&gt;This only ever engages for a session that has had no reports at all, so nothing changes for a
session where they are arriving normally.&lt;/p&gt;
&lt;h2 id=&quot;check-activity-hooks&quot;&gt;Check activity hooks&lt;/h2&gt;
&lt;p&gt;There is a new &lt;strong&gt;Check activity hooks…&lt;/strong&gt; item in a session&apos;s ⋯ menu, right above &lt;strong&gt;Reset
status&lt;/strong&gt;. It runs the whole chain end to end and tells you in one line what it found —
whether Claude Code is running Plexus&apos;s hooks, whether they are reaching Plexus, and whether
this session is pointing at an older run of the app and needs restarting.&lt;/p&gt;
&lt;p&gt;It also reports what happened on the session&apos;s &lt;strong&gt;last real turn&lt;/strong&gt;, not just a test, so a
problem that has already happened can be diagnosed without reproducing it. &lt;strong&gt;Copy report&lt;/strong&gt;
puts the whole thing on your clipboard for a bug report. Plexus&apos;s own secret is never in
it. Claude Code reports hook errors for the whole turn rather than per hook, so if any of
your other hooks failed their errors appear too — that is where your own API keys can end
up, so those errors stay on screen and are kept out of the copied report unless you turn on
&lt;strong&gt;Include these in Copy report&lt;/strong&gt; underneath them. The report still says how many there were,
so nobody reads it as &amp;quot;no errors&amp;quot;.&lt;/p&gt;
&lt;h2 id=&quot;anonymous-usage-data-is-now-always-on&quot;&gt;Anonymous usage data is now always on&lt;/h2&gt;
&lt;p&gt;Plexus has always sent one small message a day: your operating system, your processor type,
the app version, and a random install id that our server scrambles with a key that changes
every day, so today&apos;s message can&apos;t be matched against yesterday&apos;s. It is what tells us how
many people actually use Plexus — the number every decision about what to build next rests on.&lt;/p&gt;
&lt;p&gt;That message is now part of the app, it carries more, and the &lt;strong&gt;Share anonymous usage data&lt;/strong&gt;
setting is gone, along with the &lt;strong&gt;Privacy&lt;/strong&gt; page in Settings that held nothing else. &lt;strong&gt;If you
had switched that setting off, it is now on again.&lt;/strong&gt; We are telling you plainly rather than
letting you find out: the reason the switch went is that there is nothing in what we send that
identifies you, your machine, or your work, and a switch labelled &amp;quot;share anonymous usage data&amp;quot;
suggests otherwise.&lt;/p&gt;
&lt;p&gt;The message now also carries &lt;strong&gt;how much the app was used since the previous one&lt;/strong&gt; — how many
sessions you ran, how many turns you exchanged with an agent, how often each feature and Git
operation was used, and how often things failed and in what broad way. Alongside that it
carries a few coarse facts about your setup: your colour theme, which model you have
selected, whether a Git provider is connected, how many workspaces and projects you have as a
range like &amp;quot;6-20&amp;quot; rather than an exact figure, your operating-system version, how Plexus was
installed, your shell, and the version of the Claude CLI it is driving.&lt;/p&gt;
&lt;p&gt;What is &lt;strong&gt;never&lt;/strong&gt; sent has not changed, and this is the part that matters: no code, no file
contents, no prompts, no file paths, no repository, project or branch names, no commit or
pull-request text, no error messages, no IP address. Nothing you type is ever part of it, and
every value we do send is either a number or one of a fixed set of options — never free text.&lt;/p&gt;
&lt;p&gt;Three things keep it anonymous rather than merely promised. The usage counts are added into
shared daily totals the moment they arrive and are &lt;strong&gt;never stored against your install&lt;/strong&gt;, so
no record of &amp;quot;what this install did&amp;quot; exists on our side at any point. The daily id used to
count how many installs were active is &lt;strong&gt;deleted every night&lt;/strong&gt; once it has been counted. And
the random install id stored on your own machine now &lt;strong&gt;expires after a year&lt;/strong&gt; — Plexus
replaces it with a new one, so nothing identifying the install persists indefinitely, and
there is no version of it we could go back and join anything to. What survives is aggregate:
&amp;quot;1,240 active installs on macOS running 0.18.0&amp;quot;. It is all stored in the EU.&lt;/p&gt;
&lt;p&gt;If you need Plexus to send nothing at all — a locked-down machine, an offline-by-policy
network — it still honours the &lt;code&gt;DO_NOT_TRACK&lt;/code&gt; and &lt;code&gt;PLEXUS_NO_TELEMETRY&lt;/code&gt; environment
variables. Set either one before launching and no message is sent. Development builds never
send anything either.&lt;/p&gt;
&lt;p&gt;The full detail, including the legal basis, is in the Privacy Policy at
&lt;a href=&quot;https://runplexus.com/legal/privacy&quot;&gt;https://runplexus.com/legal/privacy&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;fixes&quot;&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;A session whose folder is spelled differently from how Plexus recorded it — a different
drive-letter case, a trailing slash, one of Windows&apos; long-path prefixes — no longer loses
its activity updates.&lt;/li&gt;&lt;li&gt;When the check finds that a session&apos;s hooks point at an earlier run of Plexus, or that it
has none at all, it can now repair them in place — no restart, so the agent keeps its
conversation and whatever it is in the middle of. If you have just updated Claude Code,
the repair picks that up as well and switches the session to the newer, shell-free
method — without restarting Plexus either.&lt;/li&gt;&lt;li&gt;Turning on &lt;strong&gt;Diagnostic logging&lt;/strong&gt; in &lt;strong&gt;Settings → Advanced&lt;/strong&gt; now records the whole activity
chain: whether the hooks were installed, whether Claude Code ran them, whether they reached
Plexus, and which session they were matched to.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>v0.17.1 — A commit graph that stays on screen, and links that open</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v0.17.1"/>
    <id>https://runplexus.com/changelog#v0.17.1</id>
    <published>2026-08-09T00:00:00Z</published>
    <updated>2026-08-09T00:00:00Z</updated>
    <summary>The project Git tab&apos;s commit graph could go blank and stay blank until you switched to
another tab and back. It no longer can — and while you are down in a repository&apos;s history,
refreshing now keeps your place instead of throwing it away.</summary>
    <content type="html">&lt;p&gt;The project Git tab&apos;s commit graph could go blank and stay blank until you switched to
another tab and back. It no longer can — and while you are down in a repository&apos;s history,
refreshing now keeps your place instead of throwing it away.&lt;/p&gt;
&lt;p&gt;Clicking a link in Plexus mostly did nothing, either. The &lt;strong&gt;Open in browser&lt;/strong&gt; button on a
pull-request comment, a link inside a comment someone wrote on your PR, a link in a markdown
file you were previewing, a dependency&apos;s homepage on the About screen, a link in this very
changelog window — all of them were dead. Not slow, not an error: nothing at all. They open
now.&lt;/p&gt;
&lt;h2 id=&quot;the-commit-graph-no-longer-goes-blank&quot;&gt;The commit graph no longer goes blank&lt;/h2&gt;
&lt;p&gt;Scrolling a fair way down a project&apos;s commit history and then doing anything that reloaded
it could leave the graph pane empty. Deleting a branch was the easiest way to hit it, but it
did not need a git operation at all: leaving Plexus and coming back, or an agent committing
in a session worktree of the same repository, would do it just as well. Nothing brought the
graph back except switching to another tab and returning — and typing into &lt;strong&gt;Search commits&lt;/strong&gt;
while scrolled down could empty the pane the same way, taking the search results with it.&lt;/p&gt;
&lt;p&gt;The pane now stays on the deepest position that still exists whenever the history under it
gets shorter, so there is nothing left to strand it.&lt;/p&gt;
&lt;h2 id=&quot;refreshing-keeps-your-place-in-the-history&quot;&gt;Refreshing keeps your place in the history&lt;/h2&gt;
&lt;p&gt;Loading more commits and then refreshing used to snap you back to the most recent 200, which
happened on every commit, checkout, branch switch and background refresh. A refresh now
reloads as much history as you had actually loaded, so the graph stays where you were reading.&lt;/p&gt;
&lt;h2 id=&quot;the-graph-says-when-it-is-loading-and-when-it-could-not-load&quot;&gt;The graph says when it is loading, and when it could not load&lt;/h2&gt;
&lt;p&gt;If reading a repository&apos;s history failed, the graph pane simply sat empty with no explanation
and no way to try again. It now tells you it is loading while it works, and shows what went
wrong with a &lt;strong&gt;Try again&lt;/strong&gt; button if it could not.&lt;/p&gt;
&lt;h2 id=&quot;links-open-in-your-browser-again&quot;&gt;Links open in your browser again&lt;/h2&gt;
&lt;p&gt;The button that started it was the small &lt;strong&gt;Open in browser&lt;/strong&gt; icon on a pull-request comment
thread in the &lt;strong&gt;Review&lt;/strong&gt; tab, and the &lt;strong&gt;read them on the provider&lt;/strong&gt; link next to a thread
Plexus had only fetched part of. Both went nowhere. The same fault was underneath every other
link in the app that was written as markdown rather than as a button — links inside PR comment
bodies, in the &lt;strong&gt;Explorer&lt;/strong&gt;&apos;s markdown preview, in an AI session summary, and in the &lt;strong&gt;What&apos;s
new&lt;/strong&gt; window you are probably reading this in.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mailto:&lt;/code&gt; links now open your mail client, too. They used to be styled as links, sit there
looking clickable, and do nothing.&lt;/p&gt;
&lt;p&gt;Where Plexus genuinely cannot open something — an address in a form no browser handles — it no
longer shows you a button for it. A dependency on &lt;strong&gt;Settings → About&lt;/strong&gt; whose homepage Plexus
can&apos;t open is now printed as plain text instead of a link that fails silently, and a
pull-request comment whose permalink is unusable simply has no button. If your system refuses
to open a link, you get a message saying so rather than nothing happening.&lt;/p&gt;
&lt;h2 id=&quot;session-summaries-cant-lose-the-window&quot;&gt;Session summaries can&apos;t lose the window&lt;/h2&gt;
&lt;p&gt;A link in an AI session summary was worse than dead. Summaries are written by the agent, and if
one contained a link to a file in the repository — the kind of thing an agent writes without
thinking about it — clicking it replaced Plexus&apos;s own window with a blank page, with no way back
except quitting and reopening the app.&lt;/p&gt;
&lt;p&gt;Links in a summary now behave like links everywhere else: the ones that point at a real web page
open in your browser, and the ones that point at a file in your repository do nothing at all.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v0.17.0 — Remotes without a terminal, discarding where you are looking, and a file list that remembers</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v0.17.0"/>
    <id>https://runplexus.com/changelog#v0.17.0</id>
    <published>2026-08-07T00:00:00Z</published>
    <updated>2026-08-07T00:00:00Z</updated>
    <summary>The project Git tab can now add, edit and remove the repository&apos;s remotes: right-click a
remote&apos;s heading in the refs panel to rename it, point it somewhere else, or drop it — and
hover it to see where it actually points.</summary>
    <content type="html">&lt;p&gt;The project Git tab can now add, edit and remove the repository&apos;s remotes: right-click a
remote&apos;s heading in the refs panel to rename it, point it somewhere else, or drop it — and
hover it to see where it actually points.&lt;/p&gt;
&lt;p&gt;Throwing away uncommitted work has stopped meaning a hunt through the panel header, too.
Changed files answer to a right-click like everything else in the git client, the whole
working tree can go in one action, and a single hunk can go without the rest of the file.
And in the Review tab, resolving a comment no longer drops the file from the file list —
each row now says both how many comments are still open and how many have been dealt with.&lt;/p&gt;
&lt;h2 id=&quot;add-edit-and-remove-remotes&quot;&gt;Add, edit and remove remotes&lt;/h2&gt;
&lt;p&gt;Until now the Git tab showed you the remotes your repository had and left changing them to a
terminal. Each remote&apos;s &lt;strong&gt;heading in the refs panel&lt;/strong&gt; is now a menu: &lt;strong&gt;Edit remote…&lt;/strong&gt;, &lt;strong&gt;Add
remote…&lt;/strong&gt;, &lt;strong&gt;Remove remote…&lt;/strong&gt;, and copies of its URL and its name. Hovering that heading tells you
the URL it points at, and the separate push URL underneath when it has one — so a repository whose
&lt;code&gt;origin&lt;/code&gt; quietly points at the wrong fork is something you can now see rather than something you
find out about on the next push.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Add remote…&lt;/strong&gt; takes a name and a URL — HTTPS, SSH, or a path to a repository on your own machine.
&lt;strong&gt;Edit remote…&lt;/strong&gt; renames it, repoints it, and can give it a separate &lt;strong&gt;push URL&lt;/strong&gt; so fetches and
pushes go to different places. Renaming is the safe kind of rewrite: the remote&apos;s branches move to
the new name and every local branch that was tracking one is repointed for you.&lt;/p&gt;
&lt;p&gt;If the repository has no remotes at all, the refs panel offers &lt;strong&gt;Add remote…&lt;/strong&gt; on the spot, and so
does the &lt;strong&gt;Pull&lt;/strong&gt; button&apos;s menu — with nothing to pull from, there is no heading to right-click.&lt;/p&gt;
&lt;h3 id=&quot;adding-a-remote-doesnt-reach-out-to-it&quot;&gt;Adding a remote doesn&apos;t reach out to it&lt;/h3&gt;
&lt;p&gt;The Add dialog has a &lt;strong&gt;Fetch after adding&lt;/strong&gt; switch, on by default, that runs an ordinary fetch right
after. The two stay separate steps on purpose: a typo in the URL or a credential the remote won&apos;t
accept is then reported as a fetch that failed against a remote that was still added properly,
rather than as an add that half-worked and left you guessing which half.&lt;/p&gt;
&lt;h3 id=&quot;credentials-stored-in-a-url-are-left-alone&quot;&gt;Credentials stored in a URL are left alone&lt;/h3&gt;
&lt;p&gt;Some remote URLs carry a password or a token in them. Plexus shows those URLs without it, and the
Edit dialog leaves that field empty with the stripped URL as a hint. Leave it empty and the stored
URL is kept exactly as it is, credential included; type a new one and it replaces the whole thing,
so put the credential back in if you still need it there.&lt;/p&gt;
&lt;h3 id=&quot;what-removing-costs-and-what-it-doesnt&quot;&gt;What removing costs, and what it doesn&apos;t&lt;/h3&gt;
&lt;p&gt;Removing a remote deletes your local copies of its branches and clears the upstream of every local
branch that tracked one. The confirmation spells that out first, down to which branch copies go and
how many locals lose their upstream. Your own branches and their commits stay put, and &lt;strong&gt;nothing at
all changes on the server&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Two things are worth knowing before you rename or remove one. Remotes belong to the &lt;strong&gt;repository&lt;/strong&gt;,
not to a session: every session of a project works in a linked copy of the same checkout, so the
change reaches all of them at once. And Plexus finds a project&apos;s pull requests through the remote
called &lt;strong&gt;&lt;code&gt;origin&lt;/code&gt;&lt;/strong&gt; — so renaming or removing that one clears its record of which pull request
belongs to which session, and the badges showing it. Nothing is lost on GitHub or Bitbucket: those
links come back on the next refresh, worked out from wherever &lt;code&gt;origin&lt;/code&gt; points now.&lt;/p&gt;
&lt;h2 id=&quot;right-click-a-changed-file&quot;&gt;Right-click a changed file&lt;/h2&gt;
&lt;p&gt;Every other row in the git client has a right-click menu — branches, tags, stashes, worktrees,
commits. Changed files did not, which made &lt;strong&gt;Discard&lt;/strong&gt; hard to find: it only appeared in the
panel header once you had already selected something, and the header is nowhere near the file
you are looking at.&lt;/p&gt;
&lt;p&gt;Changed files now have their own menu, in both the project Git client and a session&apos;s Git tab.
It stages or unstages the file, copies its path or its name, and discards it. On a conflicted
file it offers &lt;strong&gt;Take ours&lt;/strong&gt; and &lt;strong&gt;Take theirs&lt;/strong&gt; instead, with discard greyed out until the
conflict is resolved.&lt;/p&gt;
&lt;p&gt;The menu follows the same rule your file manager does. Right-click a file that is already part
of a selection and the whole selection is what gets discarded — the entry says which, reading
&lt;strong&gt;Discard 3 files…&lt;/strong&gt; rather than &lt;strong&gt;Discard changes…&lt;/strong&gt;. Right-click anywhere else and that one
file becomes the selection first. Staging is the exception, and the labels make it obvious: it
always acts on just the file you clicked.&lt;/p&gt;
&lt;h2 id=&quot;discard-all-changes&quot;&gt;Discard all changes&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Stage all&lt;/strong&gt; and &lt;strong&gt;Unstage all&lt;/strong&gt; have always been one click. Discarding everything meant
selecting every row by hand. With nothing selected, the header now offers &lt;strong&gt;Discard all&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Every tracked file goes back to its state at the last commit, and every new file is deleted from
disk — including new files you have already staged, which have never been committed either. A
switch in the confirmation turns that second part off if you would rather keep them, and the
dialog says how many of each it found before you commit to anything. Empty folders left behind
by deleted files go too, which the per-file discard never handled.&lt;/p&gt;
&lt;p&gt;Files ignored by &lt;code&gt;.gitignore&lt;/code&gt; are never touched, and there is no switch that changes that. Your
&lt;code&gt;node_modules&lt;/code&gt;, your build output and your local &lt;code&gt;.env&lt;/code&gt; are not part of &amp;quot;your changes&amp;quot; — they
never appear in the file list, so a confirmation could not honestly show you what it was about
to delete. If you genuinely want that, &lt;code&gt;git clean -xfd&lt;/code&gt; in the built-in terminal is one line and
carries its own warning.&lt;/p&gt;
&lt;p&gt;Discard all also refuses while a merge, rebase, cherry-pick or revert is in progress. Reverting
the working tree underneath one of those does not cancel it — it strands it, leaving git
convinced an operation is still running over files that no longer contain the resolution.
Finish or abort it from the conflict banner first, and the button explains itself in the
meantime.&lt;/p&gt;
&lt;h2 id=&quot;discard-a-single-hunk&quot;&gt;Discard a single hunk&lt;/h2&gt;
&lt;p&gt;Diffs in the project Git client already let you stage one hunk at a time. Each hunk on the
unstaged side now carries a &lt;strong&gt;Discard hunk&lt;/strong&gt; button next to &lt;strong&gt;Stage hunk&lt;/strong&gt;, for the case where
one experiment in a file did not work out and the rest of it did.&lt;/p&gt;
&lt;p&gt;It reverts only those lines, and only in the working tree. Anything you have already staged in
the same file is left exactly as it was, so a file you were carefully splitting across two
commits stays split.&lt;/p&gt;
&lt;p&gt;To discard a hunk you have already staged, unstage it first and then discard it. That is one
extra click and it is deliberate: once a file is both staged and further edited, &amp;quot;remove just
the staged half of these lines&amp;quot; has no single correct answer, and guessing at one would quietly
destroy the other half. Unstaging first merges the two into the hunk you can actually see, so
you are confirming against the real result.&lt;/p&gt;
&lt;p&gt;Discarding still cannot be undone and still never stashes anything on your behalf. &lt;strong&gt;Stash&lt;/strong&gt;
sits next to it for when you might want the work back.&lt;/p&gt;
&lt;h2 id=&quot;resolved-comments-stay-on-the-file-list&quot;&gt;Resolved comments stay on the file list&lt;/h2&gt;
&lt;p&gt;A file with comments used to carry one badge — a speech bubble and a count of its open comments.
Resolve them all and the badge went away, which left a file you had just read and worked through
looking exactly like one nobody had ever opened.&lt;/p&gt;
&lt;p&gt;Each row now shows two badges: a speech bubble with the open comments, and a check with the
resolved ones. Either appears only when it has something to count, so a file whose comments are
all resolved still says so, and a file with no comments still shows nothing at all.&lt;/p&gt;
&lt;p&gt;This was most confusing where Plexus resolves comments for you. &lt;strong&gt;Send N comments to agent&lt;/strong&gt;
resolves everything it sends, and so does each round of the review-and-fix cycle — so handing a
whole review over used to blank the entire sidebar in one click. It now reads as a count of
resolved comments per file: a record of what was addressed, on the files it was addressed on.&lt;/p&gt;
&lt;p&gt;While the pull request conversation is shown, both badges count its threads too — open threads
in the speech bubble, resolved ones in the check. Hide the conversation and they go back to
counting only your own notes, so a badge never points at a comment the tab isn&apos;t showing you.
(A pull request thread that no longer lines up with the diff still counts on its file — you&apos;ll
find that one in the conversation rather than on a diff line.)&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v0.16.1 — Git that authenticates itself, and a What&apos;s new window that shows up</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v0.16.1"/>
    <id>https://runplexus.com/changelog#v0.16.1</id>
    <published>2026-08-06T00:00:00Z</published>
    <updated>2026-08-06T00:00:00Z</updated>
    <summary>Fetch and push can now use the GitHub or Bitbucket account you connected in Plexus when your
machine has no credentials of its own. The What&apos;s new window no longer sits out the update that
introduced it, and a release now runs down the side of it rather than across the top.</summary>
    <content type="html">&lt;p&gt;Fetch and push can now use the GitHub or Bitbucket account you connected in Plexus when your
machine has no credentials of its own. The What&apos;s new window no longer sits out the update that
introduced it, and a release now runs down the side of it rather than across the top.&lt;/p&gt;
&lt;h2 id=&quot;your-connected-provider-now-authenticates-git-too&quot;&gt;Your connected provider now authenticates git too&lt;/h2&gt;
&lt;p&gt;Fetch, Pull and Push run the real &lt;code&gt;git&lt;/code&gt; on your machine, so they have always used your own
credentials — a credential helper, an SSH key, whatever &lt;code&gt;git fetch&lt;/code&gt; would use in a terminal.
On a machine that has none of those for an &lt;code&gt;https&lt;/code&gt; remote, that was the end of it: the
operation simply failed, even for people who had signed into GitHub or Bitbucket in Plexus.&lt;/p&gt;
&lt;p&gt;That connection now counts. If your machine&apos;s own credentials can&apos;t authenticate an &lt;code&gt;https&lt;/code&gt;
remote on GitHub or Bitbucket, Plexus retries the operation once with the account you
connected in &lt;strong&gt;Settings → Git providers&lt;/strong&gt; — including background fetches, which cannot ask
you for anything. Most people will simply notice that Fetch works now.&lt;/p&gt;
&lt;p&gt;Your own credentials still go first, always. The connection is only ever tried after git&apos;s
own attempt has failed, so a credential helper with wider access than your Plexus connection
keeps being the one that authenticates, and nothing about a setup that already works changes.
The token is offered only to the provider&apos;s own host, only for that one command — never
written into your repository&apos;s config or its remote URL. &lt;code&gt;ssh&lt;/code&gt; remotes are untouched.&lt;/p&gt;
&lt;p&gt;And if the provider turns that connection down — the account can&apos;t reach the repository, the
grant was revoked, your organization hasn&apos;t authorized it — Plexus rests it for a few minutes
instead of doubling every fetch with an attempt it already knows will fail. Reconnecting the
provider clears that immediately, so following the error&apos;s own advice never means waiting.&lt;/p&gt;
&lt;h2 id=&quot;git-errors-that-say-what-to-do&quot;&gt;Git errors that say what to do&lt;/h2&gt;
&lt;p&gt;A git operation that couldn&apos;t authenticate used to report git&apos;s own words:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;git command failed: fatal: could not read Password for &apos;&lt;a href=&quot;https://you@bitbucket.org&quot;&gt;https://you@bitbucket.org&lt;/a&gt;&apos;: terminal
prompts disabled&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Which reads like a Plexus fault, and isn&apos;t — &amp;quot;terminal prompts disabled&amp;quot; is Plexus deciding
never to hang on a password box you can&apos;t see. That message now names the host that refused
and what will fix it: connect the provider, sort out your credential helper, or switch the
remote to &lt;code&gt;ssh&lt;/code&gt;. If the credentials that &lt;em&gt;were&lt;/em&gt; tried got refused — an expired app password, a
revoked token — it says that instead, which is a different problem with a different fix.&lt;/p&gt;
&lt;h2 id=&quot;the-whats-new-window&quot;&gt;The What&apos;s new window&lt;/h2&gt;
&lt;p&gt;Plexus shows a &lt;strong&gt;What&apos;s new&lt;/strong&gt; window the first time you run a new version. Until now it stayed
quiet unless it already had a record of what you had last been shown — which nobody had before
the window itself existed, so the release that introduced it was the one release it could not
announce. It now opens after an update, with the notes for the version you have just moved to.&lt;/p&gt;
&lt;p&gt;A brand-new install still opens straight into Plexus. A first launch is not an update, and
nobody&apos;s first minute with an app should be a wall of release notes.&lt;/p&gt;
&lt;p&gt;The window is also wider, and the changes in a release are listed &lt;strong&gt;down the left-hand side&lt;/strong&gt;
rather than across the top, so you can see everything a release contains at a glance instead of
scrolling a strip of tabs. A long entry scrolls on its own, while the title, the release you are
reading and the buttons stay where they are.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v0.16.0 — Sessions on branches you already have, hooks that add up, and a What&apos;s new window</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v0.16.0"/>
    <id>https://runplexus.com/changelog#v0.16.0</id>
    <published>2026-08-05T00:00:00Z</published>
    <updated>2026-08-05T00:00:00Z</updated>
    <summary>Sessions can now start on a branch that already exists, repository hooks run alongside the ones
you set up rather than replacing them, and every release explains itself — in the app and on the
web.</summary>
    <content type="html">&lt;p&gt;Sessions can now start on a branch that already exists, repository hooks run alongside the ones
you set up rather than replacing them, and every release explains itself — in the app and on the
web.&lt;/p&gt;
&lt;h2 id=&quot;release-notes-you-can-actually-read&quot;&gt;Release notes you can actually read&lt;/h2&gt;
&lt;p&gt;Plexus now keeps a changelog. Every release is published at
&lt;a href=&quot;https://runplexus.com/changelog&quot;&gt;runplexus.com/changelog&lt;/a&gt;, and the app shows you what changed
in a &lt;strong&gt;What&apos;s new&lt;/strong&gt; window the first time you run a new version — one tab per feature, so each
one gets room to explain itself rather than a single line in a toast.&lt;/p&gt;
&lt;p&gt;You will only ever see it once per version. If you skipped a few releases, they are all there,
selectable from the top of the window. You can reopen it any time from
&lt;strong&gt;Settings → About → What&apos;s new&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;repository-hooks-run-alongside-your-own&quot;&gt;Repository hooks run alongside your own&lt;/h2&gt;
&lt;p&gt;A repository that commits a &lt;code&gt;.plexus/hooks.json&lt;/code&gt; used to &lt;strong&gt;replace&lt;/strong&gt; the hooks you had set up in
Plexus for that project — every event, even the ones the file says nothing about. Both sets run
now. Cloning a repo still gets you the team&apos;s setup, and it no longer costs you the hooks you
added for yourself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How repository hooks combine with yours&lt;/strong&gt; (Settings → Worktrees &amp;amp; Hooks) decides which set goes
first: the repository&apos;s hooks first (the default), yours first, or repository hooks only. That
last value is the old behaviour, if you want it back. Like the other hook settings it layers
global → workspace → project, so one choice can cover everything and a single project can still
differ.&lt;/p&gt;
&lt;h3 id=&quot;if-you-used-repository-hooks-before-this-version&quot;&gt;If you used repository hooks before this version&lt;/h3&gt;
&lt;p&gt;Hooks you set up in Plexus for such a project &lt;strong&gt;start running again&lt;/strong&gt; the next time a session
starts, resumes, or is torn down — including the teardown that runs when you delete a session or
a project. Open &lt;strong&gt;Settings → Worktrees &amp;amp; Hooks&lt;/strong&gt; on the project to see exactly what will run; the
editor points this out once, on projects that have both.&lt;/p&gt;
&lt;h2 id=&quot;plexus-tells-you-when-a-connection-needs-renewing&quot;&gt;Plexus tells you when a connection needs renewing&lt;/h2&gt;
&lt;p&gt;GitHub and Bitbucket grant a token the permissions the app had &lt;strong&gt;at the moment you signed in&lt;/strong&gt;.
If that set later changes, your existing connection quietly keeps the narrower access — and
refreshing it in the background never widens it. Until now you found out when something failed:
a repository search that couldn&apos;t list anything, or a pull-request status that stopped updating.&lt;/p&gt;
&lt;p&gt;Plexus now checks for itself, shortly after starting and occasionally while you work. When the
access no longer covers what it needs, a notice names the missing permission — in the wording the
provider itself uses, like Bitbucket&apos;s &lt;strong&gt;Workspace membership: Read&lt;/strong&gt; — and offers &lt;strong&gt;Reconnect&lt;/strong&gt;
right there, so you sign in without leaving what you were doing.&lt;/p&gt;
&lt;p&gt;It then re-checks before telling you it worked. Signing in again is not what clears the warning;
the check is. So if a reconnect happens to land on the same narrow access, Plexus says so plainly
and stops asking, rather than sending you round the same loop. &lt;strong&gt;Settings → Git providers&lt;/strong&gt; keeps
showing the warning until a check finds the access restored, and a later permissions change
raises a fresh notice — dismissing one never silences the next.&lt;/p&gt;
&lt;p&gt;Two settings under &lt;strong&gt;Settings → Git &amp;amp; PRs → Connection checks&lt;/strong&gt; control it: &lt;strong&gt;Check that provider
connections still work&lt;/strong&gt; turns it off entirely, and &lt;strong&gt;How often to check provider connections
(hours)&lt;/strong&gt; spaces the checks out on a metered connection or a rate-limited account.&lt;/p&gt;
&lt;h2 id=&quot;settings-grouped-into-sections&quot;&gt;Settings grouped into sections&lt;/h2&gt;
&lt;p&gt;Settings pages are no longer one long list. Related settings now sit together under a heading
with a line describing what the group covers — &lt;strong&gt;Pull requests&lt;/strong&gt;, &lt;strong&gt;Code review&lt;/strong&gt;, &lt;strong&gt;Fetching and
remotes&lt;/strong&gt;, and so on. Nothing moved between pages, so anything you knew where to find is still
on the same page.&lt;/p&gt;
&lt;h3 id=&quot;override-one-group-at-a-time&quot;&gt;Override one group at a time&lt;/h3&gt;
&lt;p&gt;On a workspace&apos;s or project&apos;s settings, &lt;strong&gt;Override parent settings&lt;/strong&gt; now belongs to each section
rather than to the whole page. You can override &lt;strong&gt;Copied files&lt;/strong&gt; for one project and leave
&lt;strong&gt;Session folders&lt;/strong&gt; and &lt;strong&gt;Lifecycle hooks&lt;/strong&gt; inheriting, and turning a section back off clears only
that section&apos;s overrides.&lt;/p&gt;
&lt;p&gt;One consequence worth knowing: if you had previously overridden a whole page to change a single
value, only the sections you actually edited will show as overridden. Nothing you set has been
lost — the rest of that page was inheriting all along, and now says so.&lt;/p&gt;
&lt;h2 id=&quot;start-a-session-on-a-branch-that-already-exists&quot;&gt;Start a session on a branch that already exists&lt;/h2&gt;
&lt;p&gt;Starting a session always cut a new branch for it. Now the New session dialog has a mode switch:
keep &lt;strong&gt;New branch&lt;/strong&gt; for that, or pick &lt;strong&gt;Existing branch&lt;/strong&gt; to check out a branch that is already
there. Point a session at a colleague&apos;s pushed branch to carry it forward, or at one you have
been asked to look at, and review it with the agent in a worktree of its own.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Branch&lt;/strong&gt; is what gets checked out; &lt;strong&gt;Compare with&lt;/strong&gt; is what the Review tab diffs against, what
&lt;strong&gt;Rebase onto…&lt;/strong&gt; targets, and the base of any pull request you open. It defaults to your
repository&apos;s trunk — usually &lt;code&gt;main&lt;/code&gt; — rather than whatever your main working copy happens to be
on, so a branch you did not cut is compared against something meaningful.&lt;/p&gt;
&lt;p&gt;A branch that only exists on the remote works the same way: Plexus creates a local branch
tracking it, so it starts at the remote&apos;s tip and ahead/behind counts are right from the start.&lt;/p&gt;
&lt;p&gt;Git allows a branch in exactly one working copy at a time, so a branch that is already checked
out is shown greyed out with the reason — the session holding it, your project&apos;s own working
copy, or a leftover worktree record you can clear from the Git tab.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pull base branch first&lt;/strong&gt; becomes &lt;strong&gt;Pull the branch first&lt;/strong&gt; in this mode: it fetches, then
fast-forwards the branch you picked, so you do not quietly start on a copy from last week.&lt;/p&gt;
&lt;h3 id=&quot;plexus-will-not-delete-a-branch-it-did-not-create&quot;&gt;Plexus will not delete a branch it did not create&lt;/h3&gt;
&lt;p&gt;Cancelling a start, a setup script that stops the launch, or an agent that fails to start all
clean up the session&apos;s working copy — but a branch that was already there is left alone. Only a
branch Plexus cut for the session is removed, exactly as before.&lt;/p&gt;
&lt;p&gt;Deleting one on purpose is still possible: &lt;strong&gt;Also delete the local branch&lt;/strong&gt; asks a second time
and names the branch, and it is never pre-ticked from your last answer the way it is for a branch
Plexus created. Git then keeps any branch still carrying commits that are not merged anywhere
else, and Plexus tells you it did. Deleting a project or workspace works the same way, listing
the branches it did not create before it touches them.&lt;/p&gt;
&lt;h3 id=&quot;one-thing-to-keep-in-mind&quot;&gt;One thing to keep in mind&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Rebase&lt;/strong&gt; and &lt;strong&gt;Squash&lt;/strong&gt; rewrite the branch&apos;s history. On a branch you share with other people,
that is history they may already have — so Plexus warns rather than stopping you. Nothing leaves
your machine until you push, and Plexus never force-pushes.&lt;/p&gt;
&lt;h2 id=&quot;the-pull-request-conversation-stays-out-of-the-way&quot;&gt;The pull request conversation stays out of the way&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;Pull request conversation&lt;/strong&gt; section at the top of the Review tab now starts collapsed, so
opening the tab shows you the diff rather than a wall of remote comments. Opening it is for the
visit you&apos;re on — come back to the tab later and it&apos;s closed again.&lt;/p&gt;
&lt;p&gt;Collapsed, its header still tells you what it&apos;s holding: a count of what&apos;s actually inside the
section, an &lt;strong&gt;Approved&lt;/strong&gt; or &lt;strong&gt;Changes requested&lt;/strong&gt; chip when a reviewer left a verdict, and a
warning triangle when only part of a very busy conversation could be fetched. &lt;strong&gt;Comment on the
PR&lt;/strong&gt; and &lt;strong&gt;Send N PR comments to agent&lt;/strong&gt; stay where they were, so neither needs the section open.&lt;/p&gt;
&lt;p&gt;Opened, the section takes at most about 40% of the tab and scrolls inside that, with its header
staying put. A long conversation can no longer squeeze the diff off the screen.&lt;/p&gt;
&lt;h3 id=&quot;the-count-now-describes-whats-behind-it&quot;&gt;The count now describes what&apos;s behind it&lt;/h3&gt;
&lt;p&gt;It used to count every thread on the pull request, including the ones that render against their
diff lines further down. It now counts what opening the section actually gives you — the
comments that have no home on a line, plus the review verdicts.&lt;/p&gt;
&lt;h3 id=&quot;approving-without-writing-anything-counts&quot;&gt;Approving without writing anything counts&lt;/h3&gt;
&lt;p&gt;A reviewer who clicks Approve and leaves the comment box empty — GitHub&apos;s default — used to be
dropped entirely on the way in. If they had asked for changes earlier, Plexus went on reporting
&lt;strong&gt;Changes requested&lt;/strong&gt; long after they had approved. Empty-bodied decisions now come through and
appear as a one-line entry with the reviewer&apos;s name and the verdict.&lt;/p&gt;
&lt;p&gt;The chip also reads the review history correctly: each reviewer&apos;s most recent decision counts, so
an approval replaces that same reviewer&apos;s earlier &lt;strong&gt;Changes requested&lt;/strong&gt;, while one reviewer still
asking for changes outweighs everyone else&apos;s approval.&lt;/p&gt;
&lt;h3 id=&quot;writing-a-comment-has-room-of-its-own&quot;&gt;Writing a comment has room of its own&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Comment on the PR&lt;/strong&gt; opens its box below the section rather than inside it, so the conversation&apos;s
size limit never squeezes what you&apos;re typing, and collapsing the section while you write is a way
to make room — your text stays put when you do.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>v0.15.0 — Side-by-side diffs, PR conversations, and steadier Windows sessions</title>
    <link rel="alternate" type="text/html" href="https://runplexus.com/changelog#v0.15.0"/>
    <id>https://runplexus.com/changelog#v0.15.0</id>
    <published>2026-08-04T00:00:00Z</published>
    <updated>2026-08-04T00:00:00Z</updated>
    <summary>A big review release: diffs can now be read side by side, pull-request conversations live
inside the Review tab, and several long-standing Windows rough edges are gone.</summary>
    <content type="html">&lt;p&gt;A big review release: diffs can now be read side by side, pull-request conversations live
inside the Review tab, and several long-standing Windows rough edges are gone.&lt;/p&gt;
&lt;h2 id=&quot;side-by-side-diffs&quot;&gt;Side-by-side diffs&lt;/h2&gt;
&lt;p&gt;Every diff pane — session Review, the Git tab, and the project Git client — now has a
&lt;strong&gt;Unified / Split&lt;/strong&gt; switcher. Split lays the old and new sides next to each other and marks the
words that actually changed within a line, so a rename or a reordered argument reads at a glance
instead of as two near-identical rows.&lt;/p&gt;
&lt;p&gt;Your choice is remembered globally and applies to all three panes at once. Review comments work
the same in both layouts: an anchor still belongs to a line, not to a column.&lt;/p&gt;
&lt;h2 id=&quot;pull-request-conversations&quot;&gt;Pull-request conversations&lt;/h2&gt;
&lt;p&gt;Once a session has a pull request, the provider&apos;s own review conversation is rendered in the
Review tab beside your local notes — never merged into them. Works with both GitHub and
Bitbucket.&lt;/p&gt;
&lt;p&gt;For each thread you can &lt;strong&gt;Reply&lt;/strong&gt;, &lt;strong&gt;Resolve&lt;/strong&gt;, or hand the whole thread to the agent to act on.
Comments that no longer point at any line in the current diff collect in a collapsible
&lt;strong&gt;Pull request conversation&lt;/strong&gt; strip rather than silently disappearing.&lt;/p&gt;
&lt;h2 id=&quot;search-your-repositories-when-adding-a-project&quot;&gt;Search your repositories when adding a project&lt;/h2&gt;
&lt;p&gt;The repository picker&apos;s search box now actually filters. Type to search the repositories you can
see on a connected provider, with a &lt;strong&gt;refresh&lt;/strong&gt; control beside the box for a repository you have
just created. When the list is capped, the footnote says so plainly instead of pretending it
searched everything.&lt;/p&gt;
&lt;h2 id=&quot;worktrees-that-clean-up-after-themselves&quot;&gt;Worktrees that clean up after themselves&lt;/h2&gt;
&lt;p&gt;Deleting a session — or a whole project or workspace — now reliably removes the git worktree
that went with it. Previously the &lt;code&gt;.git/worktrees&lt;/code&gt; entry could outlive its directory, which left
git holding the branch and refusing to reuse it.&lt;/p&gt;
&lt;p&gt;The Git tab&apos;s refs panel gained a cleanup action for metadata stranded by older versions, and
Plexus reclaims what it can at startup. When it deliberately keeps something — a branch you may
still want, a worktree an agent is still using — it now says so rather than acting silently.&lt;/p&gt;
&lt;h2 id=&quot;windows-sessions-that-start-and-stay-started&quot;&gt;Windows: sessions that start, and stay started&lt;/h2&gt;
&lt;p&gt;Three separate wedges are fixed. Starting a session no longer hangs on a &amp;quot;Starting…&amp;quot; spinner
that only a restart could clear. Resuming a session resumes the actual conversation instead of
opening a fresh one. And the review-and-fix cycle no longer freezes the window after its first
round.&lt;/p&gt;
&lt;p&gt;If Windows has been asking &lt;em&gt;&amp;quot;Are you sure you want to uninstall this product?&amp;quot;&lt;/em&gt; every time
Plexus updates, it can now find the older installation responsible and offer to remove it — see
&lt;strong&gt;Settings → About&lt;/strong&gt;.&lt;/p&gt;</content>
  </entry>
</feed>
