O que entrou

Novidades

Tudo o que entrou no COGNIX[WS], do mais novo ao mais antigo. Uma versão por semana.

As notas de versão estão em inglês. Até outubro de 2026 o COGNIX[WS] se chamava PiCode, e as notas mantêm o nome com que saíram.

Feed RSS →

0.8.0

150 novos · 136 melhorias · 263 correções

Novo

  • Inbox: Listen reads a conversation aloud. A Listen button in the conversation card, on the desktop and the phone (and L on the desktop), reads who it is, what it asks and the item itself with the browser's built-in voice; it stops when you pick another conversation. Nothing is sent anywhere.
  • Agent telemetry for webhooks. A new "Agent telemetry" webhook preset sends two events: one when a model refuses an agent's turn, and one report per day with the agents' working and waiting time, turns, cost and tool calls by CLI.
  • Let another app read your agent numbers. Integrations has a new "Telemetry for other apps" section: create a read-only token, and an app or script can read a short summary of your agents — how many are working or waiting on you right now, and today's and the last week's time, turns and cost by CLI. The token opens nothing else, and the summary never includes agent names, folders or prompts. Replace or revoke the token there at any time.
  • Spend keeps its history after a CLI deletes it. PiCode now keeps a copy of each day's spend and turns per CLI, sealed once the day is four weeks old. Claude Code deletes conversations after 30 days, and with them that month's spend; in Analytics › Spend, the 30-day and all-time views now keep those days and say how much came from PiCode's copy.
  • Inspector › Activity for every agent. Any agent, and any terminal running one of the nine CLIs, gets an Activity tab in the Inspector, on the desktop and the phone: what it is doing now and for how long, today's working and waiting time, turns and cost, the last 24 hours as a strip, and its latest turns with how each ended, its cost and the tools it used.
  • Removed agents keep their whole life. The removal record in Outcomes now shows the time PiCode saw the agent work and wait, its turns and what the measured turns cost, across its whole life, not only its last session.
  • Analytics › Agents: what each turn used. A few seconds after an agent finishes a turn, PiCode reads that turn from the CLI's own record and adds its cost, tokens and tool calls to the Agents tab ("What they used"), with the part priced from a list marked as an estimate and a count of how many turns were measured. Each agent's cost also shows in the Agents ranking.
  • Analytics › Agents: where your agents' time goes. A new tab shows how long agents worked, how long they waited on you (how often, the typical and the longest wait, and who is waiting right now), how their turns ended (completed, interrupted, went quiet), and agent time by CLI and by agent, for today, 7 days, 30 days or all time. It is on the phone too, and the home's Agents now tile says how long agents waited on you today. PiCode records it from the live state of every agent it runs, keeps only numbers (never what you or the agents wrote), and keeps it after an agent is removed or its CLI clears its own history.
  • Agent CLIs: launch defaults name the extensions that reach the CLI. When an installed extension adds tools or instructions for a CLI, its Customize form shows a "From extensions" line naming them, with a link to Extensions; their tools stay chosen per workspace and per agent. With none installed, nothing about extensions appears.
  • Automation start runs on OpenCode and Omp. Both join Claude Code, Codex, Grok and Hermes in *Start a new run*. PiCode now reads their input boxes (OpenCode's new-session screen, Omp's bottom row), so it types only once they are ready.
  • Sidebar: how far each branch is from its remote. A workspace's branch chip now shows ↑216 ↓3 beside it: changes here that are not on the remote yet, and changes there you do not have. Nothing shows when they match or the branch was never published. Click the numbers to see, in plain words, when the remote was last checked, and press Check now to look again — one read-only fetch, with no password prompt and a 30-second limit. The same Check GitHub now (or Check the remote now) is in the workspace's … menu, so you can ask even when the numbers show nothing; it answers in a notice. PiCode never checks the remote by itself.
  • Choose tools from installed extensions when creating or configuring an agent, with workspace defaults and separate current/next-start selections on desktop and phone.
  • Version 2 extensions implement tools once through a shared executor: native Pi/Omp, MCP for Claude Code/Codex/OpenCode, and commands for Grok/Hermes/Muse/Antigravity. Changed content requires review; launches receive only their selected groups.
  • Inbox: Grok and OpenCode refusals reach you too. When Grok's permission system or an OpenCode permission rule refuses something an agent tried, the Inbox now shows a "was blocked" item, as it already did for Claude Code.
  • Open browser tabs, web apps, local servers, terminals and artifacts beside an agent directly from the header globe or the agent's tab and sidebar menus, even before its pane exists.
  • PDFs got search, thumbnails and passwords. Press Ctrl+F (or the magnifier) to find text in a PDF: it counts the matches, steps through them with Enter and jumps to each page. A strip of page thumbnails opens beside wide previews. A protected PDF asks for its password in place. Chinese, Japanese and Korean text and scanned images now draw.
  • Large CSV files scroll smoothly. A CSV shows every row (not the first 2,000), so a file with tens of thousands of rows opens as a table too.
  • Agent panes hold up to eight browser, connected web app, terminal and artifact tabs. A flat + menu opens searchable app/server/artifact pickers with previews or a fresh shell; agent terminal commands wait for Run or Decline, with optional trust until the terminal closes and immediate Inbox attention.
  • PDFs and CSV files now open in Files. A PDF shows as scrollable pages with zoom and selectable text, on the desktop and on the phone (it used to show a blocked-page icon). A CSV shows as a table, with Raw to edit it as text.
  • Inbox: agents blocked by Claude Code's automatic permission check. When auto mode refuses a tool call, an item names the agent, the action and the reason so you can decide instead of the agent stalling silently.
  • Agents denied on a decision only you can make are now told to ask you once through the Inbox.
  • Skills: Pi gets a switch for each skill. Turn one skill off without removing it, for Global skills and for a workspace's own; only Antigravity has no switch left.
  • Open a blank tab in an agent's browser pane with the new + button, available even with one page. Its address bar receives focus while the agent keeps its current tab; Use for the agent hands the new tab over. At eight tabs, the button explains that one must be closed first.
  • Agents that create agents can give the new agent its own git worktree. create_agent and picode agent new --worktree[=name] make .worktrees/<name> on a new branch from the current one; PiCode never removes it.
  • picode msg wait <id> --for 30m waits longer than the 10-minute default (up to 30 minutes).
  • Move owned browser pages and lent apps to another agent from the pane tab menu, preserving their webview and sign-in.
  • Show site favicons in pane tabs, with app icons for lent apps and a globe fallback when missing or broken.
  • Browser: a start page. Settings ▸ Browser ▸ General has a "Start page" field; every new tab you open goes there, and an empty field keeps the blank tab.
  • Search from the browser's address bar. Type words instead of an address and the browser searches for them; choose DuckDuckGo (default) or Google in Settings ▸ Browser.
  • Antigravity agents get PiCode's tools and instructions. A launch adds a small plugin that gives the agent the PiCode tools you chose and tells it about picode msg and picode artifact; the tools appear in its launch settings like Claude Code's.
  • Connect an installed web app to an agent. In the desktop app, an app tile's menu and the app's own tab now offer Connect to agent. The app stays your tab, signed in as you, and the agent works in the same page: it shows in the agent's browser pane as a dashed tab (click it to bring the app forward), or as a "Working in" card naming the app when it is the agent's only page. The agent stays inside the app's own website, cannot use raw protocol calls there, and never sees the page move or hide. Disconnect, closing the tab, removing the app or clearing its data ends the access, and the agent is told why. Dialogs, sign-ins and downloads on the page wait for you, with an Inbox item when you are away.
  • Artifact pages with diagrams, formulas or charts work offline. PiCode now carries Mermaid, KaTeX and D3, and agents load them from it instead of the internet. A page downloaded as one HTML file carries them inside too.
  • CSV artifacts open as a table, with the header row fixed and numbers aligned right.
  • The artifact beside an agent has an Expand button, like the browser's, to take the whole width and come back.
  • The Inbox tells you when an agent's browser waits for you. A sign-in, a certificate request or a "where to save" download shows up at once; a question from the page (confirm, prompt, "leave this page?") after a minute without an answer. Open browser brings that agent's tab forward with the waiting page in front. The item closes by itself when the wait ends, and a second one says so if nobody answered for ten minutes.
  • Take an artifact with you. An artifact's new Export menu downloads a page as one HTML file (its images, styles and scripts inside), a document as its file, or the whole folder as a .zip. Save to project… copies it into the workspace, under docs/artifacts/<name>/ by default; you commit it. On the phone, Download saves it.
  • Agent tabs: the agent's browser holds several pages. An agent can list, open, switch and close tabs in its own browser, like Playwright's browser tabs; it never reaches your own tabs. The pane beside it shows one tab per page, marks the one the agent works in, and each tab has a close button and a right-click menu: Use for the agent, Keep as a tab, Close tab. A link that opens a new window becomes a new tab of the same pane, up to eight.
  • An extension can bring its own icon, shown on its Apps tile and its tab.
  • An extension can turn itself on in the workspaces it is made for — a Godot extension where the folder has project.godot, say. The install review says so, the switch shows which file turned it on, and turning it off there is remembered.
  • Extensions can add commands to the command palette and to the workspace and agent menus, and offer Open with for the files they handle (for example *.blend). A command opens the extension's page or runs in its background program, and PiCode shows its answer.
  • An extension's pages are tiles in Apps and open in a tab of their own, like any app; on the phone they are listed in More → Apps, and the page's title is in the top bar.
  • Extension pages (and artifacts) can link __picode/tokens.css to look like PiCode: theme-aware --pc-* colors and sizes, and opt-in classes for cards, buttons and inputs.
  • Browser: hand an open tab to an agent. Right-click a browser tab and choose Connect to agent: the page moves to that agent's browser with its sign-in and everything you typed. Keep as a tab (in the globe and pane menus) gives it back without closing the page.
  • Grok and Hermes Agent learn they can publish artifacts. Their launch instructions now mention picode artifact, next to picode msg.
  • Extensions can add pages to PiCode. An extension may bring its own pages — a scene tree, a render queue. Open them from the extension's page under Pages, on the computer or the phone. A page runs in a sandbox with no network of its own; it keeps its notes in PiCode, talks to the extension's background program through PiCode, and follows the light or dark theme.
  • Extensions can keep their own data. An extension may bring a database of its own; PiCode sets it up and updates its layout when you update the extension, and includes it in backups. If an update's change would fail, PiCode refuses the update and keeps the version you had with its data intact. The extension's page shows how much data it keeps.
  • Dock the agent's screen beside its session. The screen's Dock button moves the live window into a panel next to the agent, and Pop out as miniplayer moves it back. The picture steps aside while a menu or dialog is open over it.
  • The miniplayer keeps its corner and size, and whether you last docked it, across restarts of the desktop app.
  • Extension settings. An extension can ask for settings — an API key, a quality level, a path. The review lists them under Asks you for, its page shows a Settings form, and secrets are stored encrypted and never shown again. Saving restarts the extension's background program so it picks them up.
  • An extension's Show output now follows its background program live while it is open.
  • The agent's screen. Once an agent has used the computer, a monitor on its sidebar row opens a small player in a corner of PiCode that shows, live, the window the agent is using and follows it to the next one. It only shows — the agent acts on the real window — says when the window is minimized or closed, snaps to the corners, and hides when PiCode is minimized. Desktop app only. The agent cannot see or use the player itself.
  • Extensions can talk to PiCode. An extension's background program can see your workspaces and agents, message a running agent, add an item to your Inbox, publish live updates and keep a little storage of its own — only with the permissions it declares, which the review now lists under Can use PiCode to. Its messages and Inbox items say which extension sent them.
  • Extensions can run a background program. An extension that declares one lists it in the review under Runs on this computer; PiCode keeps it running while the extension is on in a workspace, starts it again after an unexpected stop, and stops it when you turn the extension off or remove it. The extension's page shows its state, why it stopped, a Restart button and its output.
  • Set plan prices from your phone. On the phone, Analytics › Spend now has a Who pays section: what you paid via API, what your plans covered at API prices, and one row per provider with how many times its price the plan was worth. Tap Set price or Edit to enter a provider's monthly price, including the box for plans sold as an API key.
  • Artifacts: a page's questions can be answered by any of eight CLIs — Claude Code, Pi, Omp, OpenCode, Hermes Agent, Codex, Antigravity or Grok. AI answers on the Artifacts page turns each on or off, sets its model and picks the default; a page's lock button picks another AI for that page. The permission question names the AI that will answer.
  • Artifact pages can ask an AI: a page may send a question to Claude Code or Codex and show the answer — after you allow it once, with a note that each question uses your plan's quota. The AI answers with no tools; at most 30 questions an hour per page.
  • Artifact pages that read your project: a page can read the workspace's files and its agents and missions — a test dashboard that reads the latest results, for example — after you allow it once. The chip under its title shows what it reads and revokes it with one click. Hidden files are never readable, and a reading page still has no network.
  • Compare what your plans are worth with what they cost. In Analytics › Spend › Who pays, enter what you pay per month for each provider's plans. The table then shows how many times its price each plan was worth in the period, at API prices, and the home's Spend card shows the same figure for all priced plans. A plan sold as an API key, like Z.ai's GLM Coding Plan, can be marked so its usage counts as plan usage.
  • Live artifact pages: a page an agent publishes can remember what you do in it (a checklist ticked on the desktop shows ticked on the phone), offer a file to download after you confirm, and save itself as a new version — only when the agent declared those abilities. Every page follows PiCode's light or dark theme.
  • Comments on artifacts: turn on Comment, click an element of the page and say what should change; a numbered pin marks it. Send delivers every new comment to the agent in one message, and the agent replies and resolves each thread with its artifact tool. Works on the phone too, with a tap.
  • Artifacts beside the agent: when an agent publishes a page or document, it opens next to that agent's terminal by itself, with a version list and Restore. A new Artifacts page (user menu ▸ Tools, and the command palette) lists them all, where you can archive or delete one; on the phone they live under More ▸ Artifacts, and a publish shows a notice with Open.
  • Artifacts, first half: any of the nine agent CLIs can publish a page or document for you to look at, with versions: the artifact tool (on by default in Claude Code, Codex, OpenCode, Pi and Omp) or picode artifact in any terminal. Pages run isolated with no network; only you can delete one, and backups include them. Seeing them beside the agent comes next.
  • Phone: Analytics. More → Analytics, or "More in Analytics" under Today, shows Spend, Activity and Limits on the phone: the period's chart stacked by CLI, the CLI, model and workspace rankings, tools, lines changed and every plan limit with its pace.
  • Dashboard: automations that failed in the last 24 hours now count in the amber "need you" line, with a button to open Automations.
  • Dashboard: after you have been away for a while, a line at the top says what happened since your last visit — agents started and finished, missions merged, questions answered.
  • Merge: Review commands in a workspace's Settings add reviewers that are commands — a Codex review preset, any SARIF tool, or the CodeRabbit CLI (its own login and plan limits). Each shows as Review with its name on the Merge tab and runs on a read-only copy of the branch; its findings join the Review block like any other.
  • Merge: under a GitHub pull request, the Review block lists the pull request's open review threads — from CodeRabbit, Codex, Copilot, Claude or a person — with Send to the agent that wrote the change and Open on GitHub. PiCode reads them only; it never posts, replies or resolves on GitHub.
  • Computer lab: Mirror into PiCode (spike). Lab-only buttons draw a chosen window, live, in PiCode's right half through a Windows DWM thumbnail (view only), refit it after a resize, report its state and stop it, so the owner can measure whether an "agent's screen" pane can be built on it. Nothing in the product uses it.
  • Workspace Settings: a Code review section beside how changes merge — choose who reviews (Codex, Claude Code, or automatically a CLI other than the author's), turn on Review automatically when an agent stops with new commits (off by default; each review uses the reviewer CLI's quota), and Require a review first.
  • Split view: up to four panes. Open or drop more tabs to get three panes or a 2×2 grid; Ctrl+Shift+arrow moves the keyboard to the pane on that side, and Even out sizes resets the dividers. A drop that would put three panes in one row or column is refused and says which halves work.
  • Snapshots read into frames of other sites too (a payment form, an embedded widget), and the agent can click, type and press keys there by ref. Needs the updated desktop app.
  • The computer tool's snapshot lists a window's controls the way the browser tool lists a page, each with a ref; clicks, pointer moves, scrolls and a mouse press can name that ref instead of a coordinate, and a control that moved or is covered is refused with stale_ref instead of clicked blind. Needs the updated desktop app.
  • Analytics. A new page (user menu → Tools → Analytics, or Open Analytics on the home) holds every usage measure by question: Spend, Activity, Quality, Limits and Coverage. Spend and turns are charted day by day, stacked by CLI, with each CLI always in the same color and a table view.
  • Changes: a Branch scope lists every file the branch changes against its target, with the open review findings in each. A file opens its diff against the target with each finding under the line it names; a finding's location in the Review block opens the same view. On the phone the files are listed under the Merge card.
  • Split view holds more than terminals. Pi agents (their conversation or their terminal), browser tabs, Git graphs, folders and apps can now share the screen. An agent with its browser open keeps it inside its own half, and the bar between an agent and its browser can be moved with the arrow keys.
  • Dashboard: limits show their pace. Each limit bar marks how much of its window has passed. When a plan is being used faster than the window lasts, the bar turns amber and says when the limit will be reached at that pace.
  • Split view: drag a tab to split. Drag a terminal or agent tab over the terminal on screen: the half it will take lights up (side by side or stacked) and it opens there. Split halves can be stacked or put back side by side from their header, Alt+G moves the keyboard to the other half, and a half whose agent needs you gets a colored frame.
  • Merge: Review with Codex (or Claude Code) under the Merge card asks the CLI that did not write the change to review it on a read-only copy of the branch. Its findings appear under the card, most severe first, with Send to (the agent's name) and Dismiss… (with a reason).
  • The browser tool's hover and select verbs, and press on an element the snapshot names. select picks a list box option by its text or value.
  • Snapshots read into frames of the same site, with refs the agent can use inside them; a frame of another site is listed with a note that its content cannot be read yet.
  • The Inbox says when messages between agents are stuck. If messages to an agent wait more than 10 minutes, one notice names how many, from whom and why; it closes by itself once they go through.
  • Split view: two terminals or agent CLIs side by side. Open one with Open to the side in a sidebar row's menu (or Alt+click the row), Split with current tab on a tab's right-click menu, or Open beside in the command palette. Both halves stay live; the two tabs sit joined in the tab strip; each half has Swap sides, Maximize, Separate and Close in its header; a half whose agent waits says Needs you. A window too narrow for two shows the half you are in and keeps the split.
  • Agents another agent started now sit under the agent that started it in the sidebar and on the phone, joined by a line. The starting agent shows a chip with a dot per agent it started and folds them away; folded, it turns amber when one of them needs you, and with Working first on the whole group rises to Needs you.
  • Merge: a Review line on the Merge tab and in a mission's review shows the open important (P0/P1) and minor findings of the branch's latest review, or that it describes an older revision.
  • Workspace Settings: Require a review first holds Merge (and a mission's Accept and merge) until the exact revision has a finished review with no important finding open.
  • Agent CLIs: Checks says when a CLI has no sign-in. Run checks now tells you when PiCode finds no login for the CLI at all — none of its own, no key saved in PiCode, no key in the environment — with a Sign in button that opens its Providers tab. It reads files only and never renews or rewrites a login.
  • The repository list in New workspace can switch to your GitHub organizations.
  • New repository on GitHub says while you type whether the name is free, with Clone it instead when it is taken.
  • Extensions: add features to PiCode from a git repository or a folder. Extensions (user menu, <kbd>Ctrl</kbd>+<kbd>K</kbd>, or More on the phone) → Install extension fetches a copy and shows what it declares — the tools and skills it gives your agents, its source and a fingerprint of its content — before anything is installed; if the content changes before you confirm, PiCode asks you to review again. Turn an extension on per workspace, and agents started there get its tools (Claude Code, Codex, OpenCode) and skills (Pi, Omp, Claude Code) on their launch, without touching your project's files. Check for update reviews new content the same way; Remove asks before deleting the extension's data.
  • Agent CLIs: a Checks tab runs the CLI's own doctor. Claude Code, Codex, Grok and Hermes get a Checks tab that runs claude doctor, codex doctor, grok doctor or hermes doctor when you press Run checks — never on its own. Each problem shows on one line with the fix the CLI suggests; for Claude Code and Hermes the full report sits under a reveal. Omp's checks moved here from its Settings pane, which keeps the list of every setting in force. The CLI's header shows the latest result ("2 problems · See checks").
  • Agents that start agents, finished. An agent can pick the new agent's model (--model, or model in the tool). If the new agent ends its turn without answering, PiCode answers for it so the agent that started it is not left waiting. On a Canvas, a dashed line ties an agent to the one that started it.
  • See which agent started which. An agent started by another agent shows "started by <name>" under its name, on the desktop and the phone, and keeps the name once that agent is gone. The Messages screen has an Agents start agents switch to stop new ones from being started.
  • Starting agents is a native tool. Claude Code, Codex, OpenCode, Pi and Omp agents get create_agent and stop_agent: hand a task to a new agent and wait for its answer in the same call. On by default, listed as Agents in each agent's PiCode tools.
  • Accept and merge. A mission in review can be accepted and its change merged in one step; the mission completes when the change is in the target branch — locally or through its GitHub pull request — and says why if the merge stops. Accept without merging keeps the old behavior.
  • Agents can hand a task to a new agent. From its shell, any agent PiCode launched runs picode agent new "the task": a new agent starts in the sidebar with that task (by default the same CLI, workspace and folder), and its answer comes back as a reply. picode agent stop stops one it started. At most eight at once per agent, and an agent another agent started cannot start more.
  • Merge pull requests from the Merge tab. Under GitHub, Merge pull request appears when GitHub says the pull request can merge, and PiCode merges exactly the commit you looked at — a push after you looked is refused. Update branch brings main into a pull request that fell behind.
  • Merge tab. The agent's Inspector shows how its branch stands against main and gives you one Merge into main button: PiCode runs your checks in the branch's own folder, then moves main to exactly the change you looked at. On a phone it is under the Inspector and Git ▸ Merge. When main moved ahead or a check fails, the tab says so and offers to ask the agent to update or fix it.
  • How changes merge, in a workspace's Settings: Automatic (GitHub projects through their pull request, others here), PiCode merges here, GitHub pull requests, or Off.
  • Choose a Pi agent's PiCode tools in chat mode too. New agent shows the PiCode tools for Pi next to its model, as it does for Omp, and choosing them keeps Pi in PiCode's chat. An existing Pi chat agent changes them on its Settings page; they apply the next time it starts.
  • New agent: pick Pi's model. Choosing Pi shows its provider, model and thinking level; the agent stays a chat agent. Pi's launch options move under "Run Pi in its terminal instead".
  • PiCode tools for Pi and Omp agents. Launch settings for a Pi or Omp agent now list PiCode's tools, as they do for Claude Code, Codex and OpenCode. Every tool starts on. Turn off the ones an agent should not have, and the next launch leaves them out.
  • New agent: a first task for free agents, and a new worktree from any branch. An agent outside a workspace can start on a task too, and New worktree picks the branch it starts from (the current one by default).
  • Idle agents step aside. With Working first on, agents idle for more than a day fold into one "Idle · N" line in their workspace; pinned agents, the one on screen and any that finished unseen never fold.
  • Open tabs show "finished, not seen". An agent's tab carries the same still dot as its sidebar row until you look at it.
  • Filter the sidebar with /. Type any part of an agent's or terminal's name, CLI, folder or branch; the list shows only what matches, grouped by workspace. Esc brings the whole list back.
  • Peek with Space. On a focused sidebar row, Space shows what the agent asks (the whole command), its plan and where it works, without leaving the page you are on; Enter still opens it.
  • Run, Run setup and teardown from .picode.json. A project that declares a run command gets a Run button on its workspace card; Run setup in the card menu sets up the workspace folder; removing a worktree from the git graph runs the project's teardown first (a failure keeps the worktree and offers Remove anyway). Workspace Settings → Scripts shows what the file declares, whether you trusted it, and can ask an agent to draft it.
  • Finished, not seen. An agent that finished while you were looking elsewhere shows its name in bold with a dot in the sidebar and on the phone, and a collapsed workspace counts them. Opening the agent on any device clears it everywhere.
  • Messaging tools for Pi and Omp. The pi-messages package gives Pi and Omp the same list_agents, send_message, read_messages and wait_for_reply tools the other CLIs have. Add it in Agent CLIs ▸ Packages.
  • Project setup for new worktrees (.picode.json). A project can list setup commands in a .picode.json at its root. When an agent gets a new worktree (New agent → New worktree, Fork), PiCode shows the exact commands the first time and whenever the file changes, runs them in a terminal you can watch, and starts the agent when they succeed; a failure offers Open terminal or Start anyway. Without the file, nothing changes.
  • Locate a moved workspace folder. When a workspace's folder is moved, renamed or deleted outside PiCode, its card says Folder not found and offers Locate folder…: pick where the project is now and the workspace keeps its agents, terminals and history. Agents working in a worktree inside the old folder move along.
  • New agent in its own worktree, or from a GitHub issue. Adding an agent to a workspace that is a git repository now offers Workspace folder or New worktree (a branch and folder of its own, made in a visible git terminal, like Fork). Start from an issue lists the repository's open GitHub issues; the pick names the agent and its branch and becomes its first prompt.
  • Keyboard in the sidebar. ↑ and ↓ move between rows, and Alt+N jumps to the next agent that needs you.
  • Messages screen. Agent CLIs ▸ Messages now shows every conversation between your agents, in every workspace, with whether each message arrived or why it is waiting. Write to any running agent with New message, and answer an agent in the conversation. A switch pauses delivery until you resume.
  • Publish to GitHub. A workspace that is a git repository with no remote gets Publish to GitHub… in its menu: choose the name, owner and visibility, and PiCode runs gh repo create … --push in a terminal of that workspace, then tells you when the repository is up. A folder with no commit yet says so instead.
  • The bottom panel's button counts your servers. While the panel is closed, its button shows how many dev servers it would list.
  • "Ready — Open" for a server PiCode started. When a terminal or an agent in PiCode starts a server that answers with a page, PiCode offers it once — *"Dashboard is ready on port 5173"*, with Open and Show servers. On by default; turn it off in Preferences → Notifications → *When a dev server is ready*.
  • Agent History can recreate eligible missing Git worktrees through the visible terminal before restoring saved conversations; mobile history explains the desktop action and its limits.
  • Sign in to GitHub without a terminal. Where PiCode needs the GitHub CLI and it isn't signed in (New repository, the Clone picker, the pull-request panel), Sign in to GitHub shows a one-time code to approve on github.com from any device. The GitHub CLI keeps the login; PiCode never sees the token.
  • Agents know they can message each other. Claude Code, Codex and OpenCode get native messaging tools (list_agents, send_message, read_messages, wait_for_reply) on every launch. Pi, Omp, Grok and Hermes are told about picode msg when they start. A connector card, PiCode · Messages, adds the tools to other CLIs.
  • New workspace: create a repository. A third source next to Local folder and Clone makes a new repository on GitHub (your account or an organization, private by default) or only on this computer, with an optional README, .gitignore and license, and opens it as a workspace. GitHub work goes through the GitHub CLI signed in on this machine; PiCode never asks for a token.
  • Bottom panel. A panel under the center, between the sidebar and the Inspector, for what is not about the selected tab — starting with the dev servers running on this machine. Open it with the panel button beside the Inspector toggle, Ctrl+Shift+D, or the command palette; drag its top edge to resize, maximize it over the center, and PiCode remembers how you left it.
  • Agents can message any other agent. Any agent PiCode launched can now message any other running agent, in any workspace, with picode msg in its shell. Nothing has to be connected first. A message is typed in as soon as the recipient can take a prompt; while it is working or waiting for your approval, the message waits. picode msg send … --wait 5m waits for the reply.
  • Desktop browser: page dialogs wait in the page, and a globe shows an agent is browsing. A page's alert, question or "leave this page?" no longer opens over the app: it waits in a bar above the page, and you or the agent answers it. A sign-in prompt waits until you open the agent's tab. A small globe on an agent's tab shows it is using its browser, in the accent colour when a page there is waiting for you. Needs the updated desktop app.
  • Pin to top for agents and terminals outside any workspace: free rows can now be pinned in the sidebar's Agents and Terminals tabs, and in the phone's Agents and Terminals views of Work.
  • Pin to top on the phone: each row in Work has Pin to top in its ⋯ menu, and a pinned row has Unpin, Move up and Move down. Pinned rows sit under a Pinned label, the same as on the desktop sidebar.
  • Pin to top on an agent's or shell terminal's ••• menu in a workspace: pinned rows sit in a Pinned block under the workspace name, before everything else (even with Working first on); drag them or use Move up / Move down to order them, and Unpin returns a row to where it was. Pins are the same on every browser and on the phone.
  • Automations: a start run on Claude Code, Codex, Grok, Hermes, OpenCode or Omp now reports the CLI's answer. When the run ends, the Inbox result and the Notify message carry the CLI's last reply, as they already did for Pi, instead of only pointing at the session.
  • Open links in Live by pressing and holding. On a phone or tablet, press and hold a link in a markdown file's Live view to open it (another file, a section, or a web page). A short tap still lets you edit the link; the first time, a small hint explains the gesture.
  • Live and Split for markdown on the phone. Opening a markdown file in Files on the phone now offers Live (edit with the formatting shown) and Split (source above, page below, scrolling together; side by side on a wide screen), next to Preview and Edit. The phone and the desktop remember the same last choice.
  • Automations and Outcomes: OpenCode, Grok and Hermes now have a cost. PiCode prices their conversations — OpenCode's and Hermes' own stores, Grok's session folder — so a scheduled start run on these CLIs shows its cost and stops at its cost limit, and a removed agent's Outcomes row says what it spent. A turn the CLI recorded as free on a model PiCode has no price for does not count toward a cost limit; the editor says so.
  • An agent's own skills stay current. Check for updates on an agent's chip now covers the skills added to that agent alone, and Update brings in the newer copy for its next start. The Launch tab lists the agent's own skills and how they reach the CLI.
  • Math and diagrams in the Live view. Formulas written with $…$ and $$…$$ and Mermaid diagrams now appear drawn while you edit a markdown file in Live; click one (or move onto it with the arrow keys) to edit its source. Amounts like "$5 and $10" stay plain text.
  • Tables look like tables in the Live view. Markdown tables in a file opened in Live now show as a formatted table — header row, borders, column alignment, and bold, code and links inside cells. Click a cell to edit its text; the table returns to its formatted look when you move away. A wide table scrolls sideways on its own.
  • Fork agent… on the phone. An agent's ••• in Work now offers Fork agent…: name the fork, choose a new worktree or the same folder, write the task and attach photos or files. The new agent's terminal opens and the task arrives as soon as it is ready.
  • Live view for markdown files. A new Live mode lets you edit a markdown file while it looks formatted: headings, bold and italic, links, bullet and task lists, quotes and GitHub alerts, code blocks and images appear as they will read, and the markdown symbols show only on the line you are editing. Task checkboxes can be ticked with a click, and Ctrl+click (⌘+click on a Mac) opens a link. The file itself is saved exactly as you typed it.
  • Antigravity's Model setting has a Choose… list with the models your Antigravity account offers. PiCode asks Antigravity in a throwaway folder with a copy of your sign-in, so your own sign-in file is never rewritten.
  • Split view for markdown files. Next to Preview and Raw, a wide file pane now offers Split: the source on the left, the rendered page on the right, updating as you type. Scrolling either side keeps the other on the same passage, and double-clicking a paragraph in the preview puts the cursor on its line in the source. PiCode remembers whether you last used Preview, Split or Raw for markdown.
  • Claude Code's Model setting has a Choose… list — the same models Claude Code's own /model offers, with their effort levels. PiCode asks Claude Code in a throwaway folder, so your Claude Code settings are never rewritten.
  • Automations can start runs on Claude Code, Codex, Grok or Hermes. In an automation's *Start a new run*, pick the CLI. PiCode opens the automation's agent, types the prompt once the CLI is ready, waits for the CLI to finish, reads the cost from its session and closes the terminal. It never approves anything for the CLI: a run that stops at a question waits for you, and the Inbox says where.
  • Grok's Model setting has a Choose… list with the models your Grok account can use, read from the list Grok keeps itself — PiCode never runs Grok to get it.
  • Did the skill help? Every agent start now records which skills it loaded, and Outcomes has a Skills section: for each skill, how often runs with it were resolved against runs without it, with sides of fewer than five answered runs marked as *few runs*. An exit's detail lists its skills.
  • Promote to the workspace. A skill you are trying in one agent says so in the Skills tab; when it works, Promote to puts exactly the copy the agent used into the workspace's .agents/skills for every agent CLI there, and takes it off the agent's own list.
  • Choose a model from the CLI's own list for Codex, OpenCode and Muse Code: the Model field in their settings gains Choose…, which lists what that CLI reports it can use in this workspace. You can still type a model by hand.
  • Fork agent… for Pi. A Pi agent's ••• menu now offers Fork agent…: a new Pi agent starts on a copy of the conversation, made by Pi itself in the new agent's own folder, and gets its task — line breaks kept — as soon as Pi is ready. Restarting the fork reopens its copy instead of forking again.
  • Skills Marketplace. The Skills tab has a Marketplace: skills from Anthropic's, OpenAI's and Vercel's own collections and from sources you add (a GitHub repository or a site with a skills index), searchable by name or description. Install opens the usual preview — files, scan, where it goes — with the skill already chosen. Also search skills.sh is off until you switch it on, and says that your search then goes to skills.sh (Vercel).
  • Fork agent… now works for Muse Code agents: PiCode asks Muse's own session server to copy the conversation, opens the copy with muse resume, and sends the task as soon as Muse is ready (a task that cannot be delivered lands in the Inbox with its text).
  • Turn a skill off without removing it. The Skills tab has a switch per skill for Claude Code, Codex, OpenCode, Omp, Grok, Hermes Agent and Muse. PiCode writes each CLI's own setting and keeps the rest of the file as it was. Pi and Antigravity have no such switch and the tab says so.
  • Try a skill in one agent. In the Skills tab, an agent's chip now has Add skill: the skill goes to that agent alone, and PiCode hands it over at the agent's next start without touching the workspace or your home folder. Works for Pi, Omp and Claude Code (as /picode-agent:<name>); the other CLIs' tabs say they cannot take a skill for one agent. A skill whose copy is gone shows as Missing, and adding or removing one marks the agent's terminal Launch changes pending.
  • PiCode-launched Pi now includes a native mission tool in managed and interactive agent runs. It uses the existing attributed mission endpoint and current PiCode session state without a workspace adapter install or .pi/settings.json entry.
Melhorias · 136
  • The user menu's "PiCode" group is now "Settings". Extensions, Preferences, Browser, Computer, Devices, System, Integrations and Terminal defaults sit under Settings, on the desktop and in the phone's More.
  • Webhooks is now Integrations. The page in the user menu (and More on the phone) holds the webhooks and the telemetry token for other apps, so it is named Integrations; searching "webhooks" still finds it.
  • Sidebar: the browser globe and the agent-screen monitor end their row flush. No blank slot at rest; on hover the row menu (⋯) appears left of the mark, so a click aimed at the mark never opens the menu.
  • PiCode is proprietary. Using it takes a license from COGNIX[WS]; the System page now says "Proprietary". Copies received before 2026-10-02 keep the Apache-2.0 license they came with, and the installable Pi packages stay MIT.
  • Connect to agent is now a dialog. Agents are grouped by workspace with free agents in their own group, you can search by name, CLI or workspace, and stopped agents stay hidden until you tick "Show stopped agents". Tabs, installed apps, the Apps grid and "Move to agent" on pane pages all use it.
  • The Computer lab sits in the tray's main list (above Quit) instead of the Labs ▸ submenu.
  • Every start run is priced. Runs on Pi, Claude Code, Codex, Grok, Hermes, OpenCode and Omp show their cost, and the cost limit stops any of them.
  • The documentation site and the README wear the agent face too. The docs site's tab icon, its logo beside the title and the logo at the top of the README now show the COGNIX[WS] agent face (white brackets and two eyes on brand blue), like the app since the earlier change.
  • The sidebar's top button shows the COGNIX[WS] logo. Where the sidebar header (and the desktop window's top row) read "PiCode" beside the brand tile, it now shows the COGNIX[WS] logo on its own; it still opens the Dashboard. When the sidebar is narrower than 280 px, the blue agent-face tile takes its place. The app is still called PiCode everywhere else.
  • PiCode wears the COGNIX[WS] agent face. The blocky "P" is replaced by the agent face from cognix.ws (two white brackets and two eyes on brand blue) in the browser tab, the icons used when PiCode is installed on a phone, the brand tile at the top of the sidebar and in the desktop window's top row, the Windows desktop app's icon, the browser extension's icon, the Inbox avatar for messages from PiCode itself, and the page shown after a sign-in completes. The name still reads "PiCode". The documentation site keeps its icon for now.
  • Browser pane: every tab has its own ×. The agent's tab now closes like webapp and artifact tabs, and the × in the toolbar is gone. Closing the last tab still ends the pane and takes the agent's browser access away; the tooltip says so.
  • The documentation's screenshots show a live PiCode: agents of seven CLIs at work in their terminals, an agent's browser and agent screen, artifacts, agent messages, a mission, a merge review, and the home and Analytics with real numbers — sharper, at 2× pixel density.
  • A new Pi agent opens in its terminal. Creating a Pi agent now works like every other CLI: it starts in its own terminal, from New agent on desktop and phone, from the API and from Continue in… Pi. The chat view driven by PiCode is still there as an explicit Chat choice under Options; it is older and is being reworked, and nothing about it was removed. Agents you already have keep the way they run, and restoring one from Agent history brings it back the same way.
  • The workspace name in the sidebar header now yields space to the branch counts before pushing the row's buttons aside.
  • Agent removal confirmation names the terminals beside the agent and warns about running foreground commands. Ordinary shell foreground programs also show as Running.
  • Inbox: a blocked item closes when you prompt the agent again. The item no longer lingers after you have answered by giving the agent its next instruction.
  • Terminals opened in an agent's pane now appear beneath that agent in the sidebar, after its child agents, and share its collapse control. Clicking one opens its pane tab; its menu offers Rename and Close. Independently opened terminals keep their existing placement.
  • No more amber side bar on a sidebar row that needs you. The "Needs you now" label and the dot on the tab already say it.
  • Missions: work in progress shows a spinner. "Sending to <agent>…", "Saving…", "merging…" and "Review: running…" carry a small ring on desktop and phone; with reduced motion the ring stays, still.
  • Request changes says whether the note reached the agent. The mission page now shows "Changes sent to <agent> at ..." or "not confirmed" with a Send again button, and it stays true after a restart.
  • A web app connected to an agent moves to the agent's browser pane. Connecting removes the app's tab and shows the same signed-in page beside the agent, with the address bar and reload; clicking the app's tile shows the agent instead of opening a second copy. Disconnect, the × on the app's tab in the pane, "Keep as a tab", closing the pane or removing the agent gives the app back as a normal tab. The "Working in" card is gone.
  • docker_containers and docker_container moved from the optional pi-sysadmin Pi package to the picode-docker extension's own agent tools; install picode-docker for them. pi-sysadmin keeps the tools that depend on PiCode's own audited operation history.
  • The built-in Docker App is gone from PiCode's core; install picode-docker for a containers page, start/stop/restart and Open with for compose files. pi-sysadmin's deeper agent tools (health monitoring, resource cleanup, maintenance plans) are unaffected — they keep talking to PiCode's own Docker connection directly.
  • A link in an artifact beside an agent opens in that agent's browser. The pane switches to its Browser tab instead of opening a separate tab; on the Artifacts page links still follow your Browser settings.
  • Connect to agent adds a tab instead of replacing the page. The page you connect joins the agent's browser as a new tab and the agent works there; the Replace question is gone because nothing leaves the pane.
  • The sidebar globe lights up like the monitor while the agent's browser is beside the tab you are looking at; a page waiting for you uses the attention colour instead.
  • The browser globe stays on the agent's row while its browser is open, like the computer's monitor, instead of disappearing 15 seconds after the last action.
  • The browser globe moved to the sidebar. While an agent drives its browser off screen, the globe now sits on the agent's row next to the computer monitor, not on its tab. Clicking it opens the agent with its browser in front.
  • An agent waits for your answer when it asks for its browser back. After you approve the Inbox request, the agent opens the browser and carries on by itself; you no longer have to ask it again.
  • Agents that create agents no longer put the task on the command line. The task is saved in a file only you can read and the new agent is told where to find it, so it is no longer visible in the process list and long tasks no longer hit a size limit.
  • create_agent and list_agents now show each agent's model flag and folder, so agents working in different worktrees are easy to tell apart.
  • An agent whose browser you closed can ask for it back. Instead of being refused until you reopen it, the agent's next browser action files a request in the Inbox. Approve lets it open the browser again; Decline or Ignore keeps it closed without further asks. Closing the browser again means it has to ask again.
  • A light line under the tabs instead of a dark one. The thin grey line under the tab strip is now a 2 px band in the active tab's tone, so the curved tab feet look the same over a terminal as over a file or web page. The curves are 10 px.
  • Providers reads cleaner. The note about logins that carry no account name is now an info icon beside the account, instead of a paragraph repeated above each provider. The "Migrated" and "Vault" tags are gone, because every account is in the vault now. "From <CLI>" stays, because it still says where a login came from. An account with no usage reading shows a single "Check usage" button in place of "unknown · Check".
  • Curved tab feet on every active tab. The active tab now flows into what is under it with the small curves Chrome draws, over terminals and agents as well as files, Git and web pages, and the curves are larger than before so they are easy to see.
  • The active tab is easy to spot. The top row (brand, tabs, window buttons) now sits one step deeper than the page, in a neutral tone with no new colour, so the active tab stands out the way it does in Chrome without the orange. Idle tabs dim their icon, the active tab's name is semibold, and hovering a tab no longer makes it look more selected than the one you are on (it did in the dark theme).
  • An artifact page's permissions now sit behind one lock button in its toolbar instead of chips over the page: what it can read, Revoke for each, and which AI answered its questions and when. A page listing the workspace's agents now sees their live state (working, idle, stopped) instead of an old launch status.
  • An agent's program opens behind you. When an agent opens a program, a file or a link on your Windows desktop, it starts behind the window you are using instead of jumping in front of it; the agent brings it forward only when it needs to act on it, and you can watch it meanwhile in the agent's screen.
  • Mobile: the Work row's ⋯ hides behind a swipe, and its menu opens as a drawer. Drag a row left and the ⋯ slides in from the right edge; tap anywhere else and it goes back. The menu itself is now a bottom sheet — same actions, no more dropdown clipped by the screen edge. A desktop browser preview keeps the ⋯ in the row.
  • Computer and Browser: the PiCode tools you pick for an agent are its permission. Check Computer or Browser under PiCode tools when you create an agent, or in a CLI's launch settings, and that agent may use it; there is no second switch to flip per agent. Clearing a tool refuses the agent from its next call. Grok, Hermes Agent, Muse Code and Antigravity get both tools from their PiCode connector, which gives them to every agent of that CLI in its scope; the other CLIs' Connectors panes no longer offer those two cards. Raw browser protocol (cdp) needs only the Browser tool and Developer mode. An agent created by another agent gets at most its creator's tools.
  • User menu: Tools and PiCode open as submenus. The machine menu had outgrown the viewport, pushing Theme and the version below the fold — the two groups are now one trigger row each, with their entries in a submenu beside the menu. Searching still flattens every match into direct rows, and the trailing caret now marks only rows that expand.
  • The desktop workspace menu keeps Overview, Missions and workspace actions; Files, Git graph, Instructions and Messages use their dedicated navigation.
  • Spend shows what you paid via API, apart from what your plans covered. The dashboard's Spend card leads with money paid through API keys. Plan usage (Claude Max, ChatGPT plans) appears under it, priced as if paid per token, and spend with no known sign-in is marked unclassified. PiCode records each CLI's sign-in over time, so every turn is counted by the sign-in it ran under. Analytics › Spend adds a Who pays card, and the phone's Spend shows the same split.
  • Files uses a more compact project layout: Reveal and Refresh sit beside Files/Changes in the sticky tree header, replacing the separate full-width toolbar. The document header keeps labelled display modes and compact, accessible command buttons.
  • Git graph's reading toolbar now uses the same compact control height and padding as Files, aligning their content below project navigation.
  • Files and Git graph now share the same page width, Back/title row, folder context and card as the other project pages. Their reading areas keep internal scrolling, and the redundant project switcher has been removed.
  • Dashboard and Analytics: when nothing ran in the period, each view says so in one line with a way forward ("Show all time"), instead of cards full of zeros; Limits and Coverage no longer show a period switch they ignore.
  • Files and Git graph now open as project pages with shared project navigation, leaving the work tab strip for agents, terminals, browsers and extension tools. File links open their document inside Files, preserving the original agent, terminal or worktree context.
  • Returning to Files or Git graph keeps the current document, unsaved edits, folder expansion and graph filters during the browser session. Existing links and saved tool tabs migrate to the new pages; mobile deep links retain their file and owner context.
  • Split view looks like one terminal window. Pane headers are slim and dark like the terminals, show only Maximize, ⋯ and Close (on hover or in the pane you are in), and the rarer actions moved into ⋯. The pane you are in has a thin accent frame, dividers are fine lines, and the split's tabs share one surface in the tab strip instead of a tinted band. The tab menu now says whose side a tab opens on: Open beside and the tab's name.
  • Merge: the automatic review starts only when an agent finishes a turn of work that committed something — opening or resuming an agent on a branch that is ahead no longer starts one.
  • Phone: Today shows the home's four numbers. Spend, Agents now, Work shipped and Limits, two by two, in the same words as the desktop; the limit shows its pace. Needs you and Recent results stay above them.
  • A new home. The dashboard now fits one screen and answers three questions in order. An amber line shows what needs you, with missions ready for review beside it. Four numbers follow: Spend, Agents now, Work shipped and Limits (the plan nearest its limit, with its pace). A chart shows spend or turns per day by CLI, and "Where it went" splits spend by CLI, model or workspace. Every other measure moved to Analytics, and a single button in the header says which CLIs the numbers cover.
  • Stuck-message notices are quieter. An agent that is only busy no longer shows as "messages not getting through": its messages wait for its turn, and a notice appears only after an hour, saying they are still waiting. A closed notice is not refiled for the same agent for 30 minutes.
  • Dashboard: the "Desktop" card is now called "Computer use".
  • Dashboard: Spend by workspace counts a workspace's worktrees and subfolders in its own row, instead of listing every worktree folder separately.
  • Merge: a review counts as clean only when the reviewer read every file the change touches. Otherwise it shows as incomplete and never satisfies Require a review first; a review with findings says how many of the changed files it read.
  • Dashboard and workspace overview use the regular interface font instead of monospace; model names keep monospace.
  • click, hover and press now reach the page as real mouse and keyboard input, so sites that ignore scripted clicks respond. When the element is hidden or covered, or the input does not arrive, the answer says so and a click falls back to the page's script; a click that lands on another element names it.
  • A list box or checkbox without a label now shows in the snapshot.
  • Workspace settings on the phone is a screen of its own, from a workspace's ⋯ menu or the Merge tab's Change: rename it, see and review its scripts, set how its work merges, publish it to GitHub, or remove it. The folder stays when you remove it.
  • Workspace settings is a page. Settings in a workspace's … menu opens a page with its name and folder, Scripts, Merge, GitHub and Remove; each part saves on its own. A workspace with no GitHub remote can publish from there. The workspace's pages — Overview, Agents, Instructions, Settings — now share one set of tabs.
  • New workspace on the phone is a screen of its own, like New agent: pick a folder, a repository to clone or a new repository, see what the folder is before creating it, and follow the steps at the bottom while it runs. A new workspace opens in Work.
  • Missions: Request changes now sends your note to the assigned agent, and the page says whether it was sent. A stopped agent or closed terminal keeps the note in the mission and tells you so.
  • New workspace is a page. The dialog became a page (+ beside Workspaces, the command palette, or New agent's "New workspace…"): pick a folder, a repository to clone or a new repository, and see what Create will do beside the form. The page says what a folder holds before you create anything, offers Open it for a folder that already is a workspace and Create it for one that doesn't exist yet, and keeps the form with the failed step when something goes wrong.
  • A new workspace opens on its overview, with Start here: New agent, Run setup, and drafts for AGENTS.md and setup scripts when they are missing.
  • The word "extension" now says which one: the Devices list tags the Chrome extension, a pi failure reads Pi extension error, and Packages reads "CLI plugins and updates".
  • Agent CLIs: Check setup joined the Checks tab. The header's Check setup button is gone; every CLI now has a Checks tab whose Run checks first confirms the CLI is installed and starts (its version and the tools activity reporting needs), then runs the CLI's own doctor for Claude Code, Codex, Grok, Hermes and Omp. The header's latest-result line works for all nine CLIs.
  • New workspace: the name is optional. Leave it empty and the workspace takes the folder's name (or the repository's, for a clone).
  • Agents answer each other without waiting for a click. Replying to another agent and starting agents (picode msg, picode agent and their tools) no longer ask for approval in Claude Code, Codex, Grok, OpenCode and Antigravity; Hermes, Pi and Omp never asked. Only these commands are allowed. Muse Code still asks.
  • How a workspace merges moved next to the merge. The Merge tab shows the current choice with a Change button that opens the workspace's settings; the Preferences page for it is gone.
  • Preferences ▸ Merge (was Landing work) no longer warns that branches will not land without rules: without any, workspaces merge automatically.
  • Saving a Pi agent's settings now shows Saved for <agent>. as a notice, like the Global and folder settings, so you see it wherever you are on the page. A failed save shows up the same way.
  • A Pi agent's PiCode tools on its Settings page now sit in the same rows as its other settings. Checking every tool again goes back to "Every tool".
  • The Inspector's PR tab is now Merge; under GitHub it still shows the pull request.
  • A merge interrupted by a restart is settled from Git when PiCode comes back — merged or not — instead of staying unknown.
  • Browser tool: type now says what the field holds afterwards (a password only by its length), so text added to a field that already had something is seen at once, and the agent can ask to replace the field's text instead of adding to it.
  • Agents point at page elements by name. In an agent's own browser, a snapshot now lists the page in its real order with a short name per element (button "Delete" [ref=e4]), and click and type take that name instead of a guessed CSS selector — it also reaches buttons inside web components. A name from a page that has since changed is refused instead of clicking the wrong thing. filter narrows a snapshot, and every action answers in one line with what it acted on.
  • Preferences → Shortcuts now works like an agent CLI's Keyboard screen. A filter, Find by key, Changed / Shared / Off counts, compact keycaps, a note when two shortcuts share a key, per-row Reset and a Reset all.
  • Pi and Omp wait for your answer. When a Pi or Omp agent asks you something through the Inbox, it now waits for your answer and carries on with it, as Claude Code, Codex and OpenCode do. It no longer ends its turn to pick the answer up later.
  • A Pi or Omp agent started before a PiCode update now says to restart the agent if its tools are out of date, as the other CLIs do.
  • A new worktree no longer tracks the branch it starts from. Starting from origin/main used to make it the new branch's upstream, so pull and push pointed at main; the branch now publishes under its own name.
  • A folder that doesn't exist is refused for every agent. Pi used to create it silently while the other CLIs refused; now New agent says "That folder doesn't exist." for all of them. Leave the folder empty for a private one.
  • Pi and Omp get PiCode tools at launch. Computer, Browser, Inbox, Checklist, Delivery, Missions and Messages now come with PiCode itself, the same way they reach Claude Code, Codex and OpenCode. You no longer install a package for them. A Pi or Omp agent gets every tool until you choose otherwise. A Pi in chat mode uses its terminal's choice.
  • Omp agents launched with --trusted-extension now need PiCode tools turned off, because Omp refuses that flag alongside any extension.
  • New agent on the phone is a screen, with worktrees and issues. The same form as the desktop page replaces the small sheet: the CLI, where it works (workspace folder, new or existing worktree), a GitHub issue or first task, and launch options, with Create at the bottom following each step.
  • New agent is a page instead of a dialog. One form for every way in — sidebar, workspace, palette, Instructions, Agent CLIs — with the CLI, where it works (workspace folder, new or existing worktree), an optional first task, and launch options, beside a live list of what Create does. The last CLI you created in a workspace is picked first; Ctrl+Enter creates.
  • Messages in PiCode tools. The messaging tools now appear in an agent's launch settings under PiCode tools, checked by default, and can be unchecked per agent. Agents that already had them keep them.
  • Test runs no longer flood the Servers list. A server shows up once it has been listening for a few seconds, and the servers a Go test binary opens stay behind *Show more*: they no longer count on the bottom panel's button or offer "ready — Open".
  • Desktop browser: downloads belong to their page. The browser's own downloads panel no longer floats over the app or stays on screen after you switch tabs. A download button in the page's toolbar lists that page's downloads, and "ask where to save" asks in the bar above the page (Save, Save as…, Cancel). Needs the updated desktop app.
  • Sidebar rows are one line. Each agent and terminal shows its icon, name and status on a single line; a second line appears only for what an agent asks you, the step of a plan still running, or a folder or branch other than the workspace's. The workspace header shows the workspace's branch once, and a finished plan leaves the row.
  • Needs you is amber everywhere. The sidebar, the tab strip, the dashboard, the workspace overview, Agent CLIs and the phone mark an agent waiting on you in amber, with the question it asks under its name in the sidebar. Working shows a spinner and Ready shows how long it has been idle.
  • Row actions appear when you reach the row. With a mouse, a row's ⋯ shows on hover, focus or selection; right-click and Shift+F10 open the same menu, which now also holds Files and Git graph. Touch screens keep ⋯ visible.
  • The Servers list stays live without polling. PiCode watches what listens on the machine once for every open window and pushes changes, instead of each open panel asking every 5 seconds.
  • Desktop browser: a site's sign-in asks in the page's own bar. When a site asks for a username and password, the question now appears in the bar above the page — never under the toolbar — and what you type goes straight to the site; the agent only hears that you signed in. Needs the updated desktop app.
  • Inbox (desktop): one row per conversation. Items from the same agent, mission, automation or pin share a row, and new activity brings a done or snoozed conversation back. The list splits into Needs you (who has waited longest first) and Updates (newest first, with Mark all done). The card beside it says who asks, what, and offers only the answers the item allows. Keyboard: j/k, a approve, d decline, r reply, e done, Shift+E all updates done, h snooze, x select, z undo, / filter. Done and snooze can be undone from the toast. Opening an agent marks its finished-run results as read.
  • Inbox: Claude Code and Codex waiting on a permission prompt now reach the Inbox at all. Their reports took a path that skipped the Inbox, so no item appeared.
  • Claude Code: cancelling a permission prompt no longer leaves it "Needs you". Pressing Esc or answering No in the terminal now returns the agent to Ready within a couple of seconds and closes its Inbox item.
  • Inbox: a CLI waiting in its terminal says what it wants. When Claude Code, Codex or another CLI stops on a permission prompt, its Inbox item now names the tool and shows the command or file (for example "Claude asks to use Bash" and git push origin main), with the CLI's own sentence when it sends one. You still answer in the terminal.
  • Inbox polish. Done rows say what happened ("got your reply", "was approved"). Toasts at the top of the desktop window no longer cover the header's icons. On the phone, the answer bar of an Inbox item runs edge to edge.
  • Inbox (phone): the same conversations. The Inbox tab lists Needs you and Updates with Inbox / Snoozed / Done tabs and a filter. On an update, swipe right for Done or left for Snooze, both undoable. Opening a row shows the conversation with its answers in a bottom bar. After you answer, the toast says whether the reply was typed into the agent's terminal, queued for its next run, or only saved.
  • Servers moved from the Inspector to the bottom panel. The Inspector keeps what follows the selected tab (Changes, Files, PR), and in the panel's width the server rows sit side by side.
  • Machine menu: the version line no longer sits against the bottom edge. The last line of the menu now has the same breathing room as the top of the menu.
  • Dark theme: the PiCode logo tile shows its edge. A faint outline now separates the logo's dark tile from the dark top bar and sidebar header.
  • Narrow windows: navigation is a drawer over the page. Below 768px, Navigation slides the sidebar in from the left above a dimmed page, instead of pushing the page down. Click the dimmed area, press Escape or pick a destination to close it. The PiCode name no longer shows twice.
  • Sidebar: the view tabs no longer share a row with buttons that open pages. The sidebar header now holds only the five views (Workspaces, Agents, Terminals, Apps, Pins), drawn as a segmented control. Inbox is a row under the header, with its count, and it is highlighted while the Inbox is open. Agent CLIs is the icon beside the machine name at the foot of the sidebar, and it keeps its dot when package updates are waiting.
  • OpenCode's device-code sign-ins (such as ChatGPT headless) show the code large on its own line with a Copy code button, like the Grok and Codex sign-ins.
  • When an Antigravity or OpenCode sign-in window reopens on its paste step, the cursor is already in the code field.
  • Signing in to Antigravity in the desktop app no longer asks you to copy and paste Google's code: PiCode reads it from the page Google ends on, closes that tab and finishes the sign-in.
  • Fork agent… no longer asks for a task. The fork opens on its copy of the conversation and waits; give it its first task in its own session. The dialog (desktop and phone) keeps the name and where it runs — a new worktree or the same folder.
  • A llama.cpp download that PiCode lost track of and the server no longer has is now marked Interrupted on its own, so the model can be downloaded again without choosing Abandon first.
  • Finished llama.cpp jobs older than 30 days are cleared at startup (the newest 500 always stay).
  • Phone: a CLI's Settings line up — a setting with a list or a text field shows its name above and the field across the full width, instead of fields starting at different points beside the name.
  • Connectors with nothing configured show the same empty state as Packages — a centred "No connectors yet." with an "Open the Marketplace" button — instead of a lone grey line with no action.
  • Phone: Packages' empty state matches the desktop — a centred bold "Nothing installed." with its action under it.
  • When a CLI's Choose… model list can't be loaded, the message now comes with the one step that fixes it: Sign in (opens that CLI's sign-in), Open Grok (Grok signed in but never started), or Try again.
  • Phone: pins and snippets have one save button — the form's own Create/Save; the duplicate Save in the header is gone.
  • Phone: Missions, new pins and snippets, and the terminal's status messages use the full width. They start at the phone's 14px edge like every other screen, instead of about 30px.
  • Markdown files now preview the way GitHub shows them. Headings have real sizes and section links, lists keep their bullets, and tables, quotes and code blocks are styled (code is highlighted, with a Copy button). Also supported: GitHub alerts (> [!NOTE], [!TIP], [!WARNING]…), math, Mermaid diagrams, footnotes, frontmatter shown as a table, and safe inline HTML such as a centered README logo or <details>. Images and links that point to other files of the project work: the image loads, and in the file tree a click opens the linked file. When the pane is wide, an "On this page" outline follows along as you scroll.
  • Phone: Agent CLIs and app pages use the full width. Agent CLIs (every section, Messages and Settings) now start at the phone's normal 14px edge instead of about 30px, setting labels line up with their headings, and app pages (tmux, Docker, …) keep less padding inside their groups.
  • Phone: long tab bars get arrows and a list. Preferences, a CLI's sections, the CLIs bar and llama.cpp's sections no longer show a scrollbar on a phone: arrows, edge fades and an "All sections" list appear when the tabs do not fit, and swiping still scrolls them.
  • One login per CLI. Using an account in a CLI when another CLI already holds that same login now offers a separate sign-in instead: sharing one login lets the first CLI to renew it sign the other out. A login two CLIs already share is marked "shared with …" in Providers.
  • Command palette: CLI commands no longer assume Pi. With no agent selected, CLI settings, Packages, Skills, Connectors and Providers open the Agent CLIs catalog so you pick the CLI, instead of opening Pi's page. With an agent selected they open that agent's CLI, as before. Mobile More's search shortcuts follow the same rule.
  • The HTTPS certificate no longer lists Docker's internal addresses. Issuing or renewing it now skips Docker's virtual network bridges and WSL's internal loopback address. It keeps your LAN, Tailscale and loopback addresses. A renewal keeps every name the old certificate had, but recomputes its addresses from the network as it is now.
  • Tab bars inside pages overflow like the editor tabs. The CLI sections, the CLIs / Messages / Settings bar and an app's page tabs no longer show a horizontal scrollbar in a narrow window: arrows, edge fades and an "All tabs" list appear instead, and the selected tab stays in view.
  • Agents are told when their PiCode tools are out of date. After an update that changes how PiCode's tools talk to it, a tool call from an agent that was started before the update now answers "Restart the agent to load the new tools" instead of failing with an obscure error.
  • Agent CLIs: the tmux guard and browser hand-off switches have their own Settings tab. They apply to every PiCode terminal, not to the CLI you pick, so they left the top of the CLI catalog for a third tab beside CLIs and Messages (#/clis/settings), on desktop and mobile.
  • Scrollbars stay out of sight until you point at them. Every scrolling area now hides its scrollbar while the mouse is elsewhere, the way the sidebar already did: pointing at the area, focusing it from the keyboard or dragging the bar brings it back, with no shift in the layout. Touch screens keep their bars drawn, and the Instructions table that scrolls sideways keeps its bar visible so its hidden columns stay obvious.
  • A skill whose folder has another name installs under its name. Some published skills keep a folder named differently from the skill (4 of Vercel's); installing now writes the folder under the skill's name, and the preview says so, instead of refusing.
  • One scope vocabulary in setup tab links. Packages, Connectors, Skills, Memory, Settings, Keyboard and Models now all put their scope in the address the same way — ?scope=global, ?scope=workspace or ?scope=agent — and moving between these tabs keeps the scope you chose. Older links (?scope=project, ?scope=user, ?scope=machine, ?layer=…) still work and are rewritten.
  • The dashboard refreshes about 20× faster. When one agent CLI writes, only that CLI's numbers are recomputed; a warm refresh went from ~275 ms to ~14 ms on a machine running nine CLIs.
  • Scope chips carry an icon. In Skills, Packages, Connectors, Settings, Models and Memory, the chips that pick where something applies now show a globe for Global, a folder for the workspace and the agent glyph for one agent.
  • Agent CLIs: the desktop rail button now follows the context rule of the CLI panes — with an agent selected it opens the view directly at that agent's CLI instead of defaulting to Pi; with no agent in context the legacy #/clis address is kept.
  • The Missions guide now explains Pi's built-in reporting tool and when other agents use MCP or the command fallback.
  • Busy agents keep their spinner in the default sidebar. A Working or Running pill now shows its spinner at 280px too, and only the age is dropped.
  • A Pi Settings workspace deep link (#/clis/pi/settings?workspaceId=…) keeps that workspace through a reload, the layer switcher and the Settings/Keyboard tabs, and names the folder on the project layer even with no agent selected. A missing or unknown id is an error with a way back to Global settings — it does not silently open another workspace or pick an agent. On a narrow screen a pane tab that is only partly in view is hidden, so a deep link never shows a clipped label.
Removido · 26
  • Browser lab (tray). The spike window that answered the work browser's engine questions (login persistence, the Chrome-UA override, OAuth popups, CDP reachability) — the shipped work browser supersedes it. Its profile helpers live on as desktop-shell/src/profile.rs. Needs the updated desktop app.
  • Computer lab: the Embed and Mirror spike buttons. The 2026-09-18 benchmark recommended the DWM mirror over reparenting, and the mirror shipped as the agent screen; the lab keeps exactly the computer commands it exists for (windows, screenshot, act, snapshot). Needs the updated desktop app.
  • Mobile PinItems component: the pin actions render inside the row's action drawer now.
  • Settings ▸ Computer ▸ Agent access and Settings ▸ Browser ▸ Agent permissions. The per-agent lists and the switches saved behind them are gone. Every agent launched with the Computer tool may now use the desktop, and with Developer mode on, every agent with the Browser tool may send raw protocol calls. Both pages keep their audit of what agents did.
  • The agents' delivery tool. Agents no longer declare deliveries: the owner merges from the Merge tab or with Accept and merge, and an agent in a mission reports through the mission. Agents configured with the old tool still start — without it.
  • Missions no longer take a Delivery ID as evidence; evidence that already cites one stays in the record.
  • The pi-diff package and its /diff side panel in the Pi terminal. What an agent changed is in the Inspector's Changes tab, for every CLI.
  • The Delivery view on desktop and phone; old links open the Git history or the Merge tab.
  • The old agent connections. The enrolled per-workspace mailbox (picode messages, connection credentials, participant setup and connection tests) is gone, with its message history. Agents message each other with picode msg and the Messages screen instead. Canvas links are now drawings: they no longer grant anything or read broken, and drawing or removing one asks nothing.
  • The per-workspace Communication setup (participants, Apply and connect, connection tests and the Canvas link list). Agents no longer need it to talk.
  • The Pi browser-capture extension (pi-browser-capture) and the live browser frames it fed into agent tool rows. Use the PiCode browser beside the session to watch an agent browse, with any CLI. Old sessions still open; their browser tool rows just no longer show the last frame.
  • API: routes nothing called are gone. GET/POST /api/workspaces/{id}/principals, the DELETE /api/managed-clis/{id} alias, POST /api/agent-exits/{id}/undo, DELETE /api/browser/annotations/{id}, POST /api/browser/permissions/clear, and the Pi-era POST /api/agents/{id}/login and /api/agents/{id}/command. Create and remove CLI agents with POST /agents and DELETE /api/agents/{id}; Undo after a removal is a restore.
  • Windows: the Go tray migration. picode-desktop no longer accepts --tray or startup-repair --retarget-shell; startup repair works on the shell resident only. Your startup task already starts the shell.
  • Old-version fallbacks in the desktop shell and server. The Disk tab no longer retries without streaming, browser automation calls always carry their domain list, and a Pi terminal still running a receiver from before it reported its wrapper no longer recovers its runtime until it restarts.
  • Leftovers: the cmd/uicheck debug tool and the cleanup of a dashboard preference retired long ago.
  • Leftover compatibility code. PiCode no longer rechecks ~/.claude/settings.json for hooks an early build wrote there (the file is clean), no longer reconciles Inbox reply tasks in a format from an earlier version, and #/clis/<cli>/launch is no longer rewritten to #/clis/<cli>.
  • More old compatibility paths. The /api/apps/inbox/{view,action} aliases are gone (use /api/inbox/*); a tmux session without PiCode's instance stamp is no longer judged by its port; the work browser no longer carries the hide-and-freeze path for desktop shells from before live overlays; and Pi's package install, update and remove now answer with the same report GET /api/packages/report?cli=pi returns.
  • Old API routes and fields. GET /api/packages (Pi's list in its old JSON) and /api/pi-keys are gone; read Pi's packages with GET /api/packages/report?cli=pi and its key map with /api/cli-keys?cli=pi, the routes the app already used. Workspaces no longer carry a single agent field; read agents.
  • Compatibility for terminals from before the per-instance tmux socket and before Pi agents got their own terminal. PiCode no longer looks for sessions on your default tmux server or for old picode-<agent id> Pi panes, and old tabs pointing at them no longer reconnect. Every terminal lives on PiCode's own socket.
  • More old links. #/app/inbox, #/app/matrix, #/preferences/status, #/clis/terminals and mobile #/changes/... no longer redirect; open #/inbox, #/app/canvas, #/clis and the Inspector instead. A saved Matrix tab from before the Canvas rename is dropped on reload.
  • Old scope words in links. Setup links carry only ?scope=global, workspace or agent; ?layer= and the older words (user, project, machine, local) now read as an unknown scope.
  • Old browser settings. The terminal theme and font size stored before terminal preferences existed, and the Canvas keys from before the rename, are no longer read.
  • picode gateway --insecure-listen. Use --plain, which it was an alias of.
  • Old Pi-era Sessions and Providers links. #/sessions*, #/clis/sessions*, #/providers*, mobile #/more/providers* and #/clis/providers[/<cli>] no longer open Pi's panes. A CLI's panes live at #/clis/<cli>/sessions and #/clis/<cli>/providers. #/providers/llama still opens llama.cpp.
  • Old Pi-era Packages and Connectors links. #/packages, mobile #/more/packages, #/clis/packages[/<cli>], #/mcps, #/more/mcps, #/integrations/connectors and #/clis/connectors no longer open Pi's panes. A CLI's panes live at #/clis/<cli>/packages and #/clis/<cli>/connectors; #/integrations now opens Webhooks.
  • Old Pi-era settings links. #/settings, mobile #/more/settings, #/clis/settings/<cli> and the ?tab=keys sub-tab link no longer redirect to Pi's settings. A CLI's settings live at #/clis/<cli>/settings.
Correções · 263
  • Charts: every axis label reads the value its line sits on. A Spend chart under $2 a day read "$2 $2 $1 $1 $0" from top to bottom; it now reads "$2 $1.5 $1 $0.5 $0". The Turns and Agent time charts no longer round half steps into wrong or repeated labels ("0 3 5 8 10" turns, "1h" twice).
  • Pi and Codex stats load at once after a restart too. Their usage history is now kept on disk like Claude Code's, so the home page and Analytics no longer wait several seconds for them after PiCode updates.
  • Stats load at once after PiCode restarts. The home page and Analytics used to wait about 20 seconds after every restart or update while PiCode reread all your Claude Code history. PiCode now keeps what it read on disk and rereads only the sessions that changed while it was down.
  • Usage and spend stats stay fast while Claude Code sessions run. A running session's transcript used to be read again from the start every time the numbers refreshed, which took over half a second for a large session. PiCode now reads only the new lines.
  • A new worktree shows up at once, with less background work. PiCode now notices a git worktree add on the next check instead of up to half a minute later, and stops asking git for the worktree list every few seconds when nothing changed.
  • Less background git while PiCode is open. The watcher behind the sidebar's branch and change badges used to re-read every folder every three seconds. It now checks first whether anything in the folder's git data moved, and reads only then — or every 15 seconds, or every tick for a folder that changed in the last two minutes. Commits, branch switches and fetches still show within seconds; the first edit in a folder nobody touched for a while can take up to 15 seconds to show. With a window open, about a quarter of the processes it used to start.
  • The Changes list and file tree stop hammering git. Each open Inspector, file tree and phone Changes screen re-read the whole repository and its worktrees every time a folder changed, so several open windows multiplied the work. Readers of the same folder now share one read for two seconds, and anything you do through PiCode still shows at once. On the PiCode repository under the same load the request takes about 2 ms instead of 280 ms and starts about a seventh of the processes.
  • Attaching a file to an agent, or sending it browser annotations, no longer leaves an untracked .picode/ folder in the project's changes. Projects that already show it are cleaned up the next time a file is attached there.
  • PiCode uses far less CPU in the background. Keeping the sidebar's git and terminal facts fresh started thousands of short-lived git and tmux processes a minute. Each folder is now read with one git call instead of five, the folder watcher slows to every 30 seconds while no PiCode window is open, and terminals are checked with one tmux call per pass instead of two or three per terminal. On a machine with 13 workspaces and 53 terminals that is about 100 background processes a minute instead of 4,000 when nothing is open, and about a third of the CPU while you use it.
  • The sidebar and fleet lists load much faster. Listing workspaces read every agent's git status again, one agent at a time, even when twenty agents shared one repository: about 1.4 s and some 900 short-lived processes per refresh on a busy machine. It now reuses the git reads PiCode already makes every few seconds, so the same refresh takes about a tenth of a second.
  • The event log no longer grows forever. PiCode now prunes it once a day: seven days for most events, ninety for the computer and browser audit records that Analytics and the raw-CDP audit read. Removing an agent no longer erases the audit rows recorded about it.
  • The "Agents and inbox" webhook preset sends every agent event. It now also matches agent_ events (agent_exit.recorded, agent_started, agent_stopped, agent_process_exit), which the old agent. prefix silently skipped. Webhooks you already created keep their prefixes; add agent_ to receive these.
  • The "Tasks and automations" webhook preset includes automation runs. It now subscribes to run. too, so a run's start, progress and finish reach the URL. A subscription saved with the old preset shows as custom events and keeps working.
  • System's menu line says what the page shows: "Version, host, network" instead of "paths".
  • Inbox: markdown keeps its shape. An item's body on the desktop and the phone now uses the same markdown styles as the chat: bullet and numbered lists keep their markers and indent, headings get their sizes, and task lists show checkboxes instead of bullets.
  • Inbox titles and bodies cut at their length limit no longer break an accented letter or an emoji in half.
  • Canvas: switching canvas right after panning or zooming keeps the view you left; a drag no longer snaps back when the connection drops and returns mid-save.
  • Canvas: zoomed-out terminal snapshots stay current for agent panels and are refreshed when you come back; deleted terminals' snapshots are released.
  • Canvas: a terminal shown in two places at once (a split beside its Canvas panel) says "This terminal is showing in another pane" with Show here, instead of going blank.
  • Canvas: no spurious "Canvas changed elsewhere — reloaded" after typing in a text panel; a canvas or panel deleted in another window no longer reappears; two text panels added quickly no longer flash twice; a far-away saved view at high zoom is restored where it was.
  • Canvas: on a phone, notices sit above the zoom buttons instead of covering them; a text panel's header shows the Text mark instead of the terminal one.
  • Sign-in pages from Node tools open inside PiCode. npx wrangler login and other tools built on Node (Vercel, Netlify, Firebase) opened the Windows browser from a PiCode terminal on WSL; they now open in the desktop app's own browser tab, like every other sign-in.
  • Canvas: Undo after removing a text panel brings it back with its words; it used to fail with an error and lose them.
  • Canvas: text typed just before switching canvas is saved on the canvas it was written on, instead of failing and being lost.
  • Canvas: deleting a canvas warns when a file on it has unsaved changes, and closing the page asks first while a file draft is kept on another canvas. A file panel removed in another window discards its draft and says which file, instead of bringing a stale draft back later.
  • Canvas: the guide no longer describes links as a messaging permission; since open messaging, a link is a drawing.
  • The Providers pane's usage reading no longer overlaps the 7-day spend column; its bars now shrink to fit.
  • Agent history preserves reviewed extension tool choices, including an empty selection, instead of replacing them with current workspace defaults. Unavailable choices remain visible for review before starting.
  • Muse forks with selected extension command tools refuse before copying a conversation, with the same next action as unsupported resume.
  • Desktop: PiCode's window keeps its size and position across a restart of the app, and a maximized window comes back maximized instead of small.
  • "Open agent" in the Inbox (and any other link to an agent) no longer opens a second tab for an agent that is already open; it selects the existing tab.
  • Package report coverage tests use fixture CLIs instead of installed vendors, preventing Hermes launchers from being rewritten with temporary interpreter paths during CI.
  • Fixed: PiCode no longer renews the Pi login that Pi is using (Anthropic, xAI and the other sign-ins Pi holds). Pi renews it itself; a second renewer made the provider reject the login with invalid_grant. Usage now says "Waiting for Pi to renew this login" until Pi's next use.
  • Fixed: editing Pi's login file from PiCode now waits for Pi's own lock and swaps the file in one step, so a Pi renewal written at the same moment is not lost.
  • Usage for a Pi login that Pi has not renewed for 12 hours, or when Pi is not installed, now says "Sign in again" instead of waiting for Pi forever.
  • Desktop pages refresh terminal activity before removal decisions, clean idle pane terminals, and return lent apps after an agent is removed elsewhere. Running terminals and terminals whose activity cannot be confirmed stay available in the sidebar; detached terminals lose pending command confirmations and agent trust. Stopping an agent or a failed fleet read does not trigger cleanup.
  • Scratch cleanup retries a temporary tmux exit race on its private socket instead of failing when the server has already ended.
  • Messages between agents are no longer typed blind into Muse Code or Antigravity. Muse Code cannot tell PiCode when it is ready, so a message to it waits for you; Antigravity gets it once it reports being idle (a draft you left in its input box is not detected). A held message tells the sender it was not typed, and Messages offers "Type it now" and "Open agent". A sign-in screen in Antigravity now reads as needing you.
  • A Pi terminal that became an agent keeps its model, provider, thinking level, extra instructions and read-only mode; it starts instead of refusing over leftover launch options. Options no agent setting can carry are removed, and an Inbox note names them.
  • Antigravity skills are found after its 1.2.14 move. Skills in ~/.gemini/config/skills are listed, and a skill reachable through both the old and the new folder appears once.
  • A CLI link typed with a name like #/clis/antigravity/skills opens Antigravity's own page instead of another CLI's header over an error.
  • Agents answering another agent's message or task no longer run backticks in their own text as commands: PiCode's reply hints now show a quoted heredoc, and picode msg send|reply and picode agent new read the text from stdin.
  • A program an agent opens stays behind, even when the agent looks around right after. Listing windows, taking a screenshot or waiting no longer ends the watch that keeps a late window (VS Code, a splash) from coming to the front.
  • Opening a command-line launcher such as code no longer leaves a console window, and the answer names the real program window instead of the console. When a link opens in a window that was already running (a Chrome tab), the answer names that window.
  • The agent screen no longer mirrors the Windows taskbar. When an agent clicks the taskbar, the desktop or the Start menu to reach a window, the screen keeps showing the app it was following.
  • Codex agents follow your own Codex safety settings again. A new Codex agent (and a resumed one that saved no policy) uses the sandbox and approval policy of your Codex config instead of asking for approval on every command.
  • Restore Antigravity agent instructions and selected PiCode tools through a private launch plugin while keeping commands and edits in the project. Sessions remain associated with the project after private launch links are removed.
  • Codex agents with saved launches containing no safety options can resume with workspace-write and on-request. New agent launches without safety options now pass and save that pair explicitly, overriding implicit native policy customization. Explicit owner policy options remain unchanged on fresh launches; partial, ambiguous, bypass, config and profile options remain refused on resume.
  • An agent reading a terminal beside it gets the lines that matter. The empty rows under the prompt are no longer sent, so asking for the last few lines returns the latest output.
  • picode agent new --help (and -h) prints the usage instead of starting an agent with "--help" as its task. picode msg send|reply do the same, and a task or message whose first word is an unknown --flag is refused with the usage; put -- before text that really starts with dashes.
  • OpenCode agents can read PiCode task files without an approval prompt, including when activity reporting and PiCode tools are off; task-file edits remain denied, with scoped rules that preserve existing exact-tool permissions.
  • Antigravity agents keep shell commands in their launch folder. PiCode's private launch plugin is temporarily disabled because Antigravity treats its folder as a competing workspace; selected PiCode tools remain saved, but launch tools and instructions are unavailable.
  • Agent launches skip folder-trust questions through a PiCode-owned Codex profile, run environment settings for Claude Code and Grok, and Antigravity/Pi run flags (including managed Pi). Native trust stores remain untouched; explicit and configured default Codex profiles and owner environment choices are preserved. Desktop and phone notices and launch plans disclose this behavior; phone launch settings show the full injection plan and offer Open System when terminal control is unavailable.
  • Skills: turning a skill back on no longer deletes your settings file. When the switch was the file's only setting, PiCode removed the whole file (Claude Code, Codex, OpenCode, Omp, Grok, Hermes); it now keeps it.
  • No gray scrollbar between the agent's pane tabs and its + button. The tabs still scroll sideways when they do not fit.
  • An agent that made another agent no longer hears "finished" too early. A Claude Code agent that ends its turn while its own background work is still running (a build, a monitor) is not reported as finished until that work is done, or after 20 minutes. Sending it a message in the meantime is delivered instead of being refused as an unrecognized prompt.
  • The browser shows each page's real title, including unread counts used by installed web-app badges; desktop tab metadata also carries the page's favicon URI.
  • Replace older unread browser switch, close, take-back and disconnected notices of the same kind while preserving other notices in order.
  • Notify the source agent when its last owned page moves to another agent.
  • Browser references stay on their original page. After a person chooses "Use for the agent" on another tab, actions using references from the previous snapshot report that they are stale before sending an action to the new page.
  • Retry agent shutdown when its terminal has already closed but a captured process is still alive. Pending shutdowns now report the closing process instead of incorrectly claiming an automation is running; removal stays blocked until the process exits.
  • Artifact comment pins sit outside their elements, avoid page text at viewport edges, and separate shared corners when space permits.
  • Review: the reviewer's own Changes tab no longer counts PiCode's review scratch folder.
  • Review: when the agent that wrote the change is stopped, the Review block says so in words and offers to open it, instead of a Send button that could not deliver.
  • Workspace settings: phone and desktop both call the "follow the machine" choice "Same as this machine".
  • Accept and merge finishes after a restart. If PiCode stopped right after you clicked Accept and merge, retrying the same click could report the mission as accepted without ever starting the merge. The retry now starts it, once.
  • Restore Expand browser / Back to split in the plain-browser side pane, including after switching from an expanded artifact.
  • Git graph rows no longer show agent chips beside branches, keeping branch names and commit messages readable in workspaces with many agents.
  • On the phone, an extension's page fills the screen: no empty band under it, and only the page scrolls, not the screen around it.
  • Dashboard: forked Pi and Omp sessions no longer count the parent's history twice. A fork copies its parent's messages with their cost; the parent now owns them (about 258 messages and 2,495 Omp messages over 30 days here).
  • Dashboard: a native handoff into OpenCode, Hermes or Antigravity no longer counts the copied history again.
  • Dashboard: Claude Code fork cost is right for a fork of a fork, for a parent whose cost snapshot came late, and for a fork priced at $0.
  • A name you type for a saved account (even "Account 3") is never changed by the start-up tidy.
  • Old vault backups made by the start-up tidy are deleted after 30 days; the newest is always kept.
  • Starting a sign-in no longer fails with "already in progress" or "callback port busy" because an earlier one was left open. A new sign-in now replaces one you never finished, Cancel frees it immediately, and a finished device-code sign-in (GitHub Copilot, Kimi, xAI) no longer blocks every later sign-in until PiCode restarts.
  • Work browser: with the device toolbar on, zooming the page with Ctrl + / − now updates the toolbar's zoom label right away.
  • A web app connected to an agent keeps its title and its unread badge. The agent's tab list names it, and the tile's badge keeps counting while the app is in the agent's pane.
  • Opening an extension page from a menu, the command palette or "Open with" while Home is in front now shows the page right away, even when its tab was already open behind Home.
  • A web app connected to an agent while it was closed now shows in the agent's pane instead of a blank page with the address bar.
  • An artifact's close button stays in the same corner. The toolbar no longer wraps at medium widths (which dropped × to a second line); below the width where everything fits, more controls fold into the ⋮ menu, and Expand and × always sit at the top right.
  • Muse Code agents no longer stall on the "Do you trust this workspace?" question when PiCode starts them in a new folder; the folder is trusted for that run only.
  • Browser: Ctrl + / Ctrl −, Ctrl + mouse wheel and pinch zoom the page. They did nothing on a page in the work browser.
  • Browser: the ⋮ menu shows the page's real zoom. After Ctrl + or Ctrl − in a page (or a restart) it said 100% and the next step started from there.
  • Browser: the address bar follows the page. After opening a site from the list of pages you visited (or with Enter), the bar showed what you had typed instead of the page's address.
  • Browser: typing an address does what you meant. localhost:3000 opens over http, example.com opens example.com instead of the first history row that contains it, and text that is not an address says so instead of failing as https://….
  • Browser: clicking the address selects it all, Esc twice restores the page's address, and with the short (origin-only) address display on, Enter no longer reopens the site's home page.
  • Browser: Ctrl+. arms annotate only in the tab on screen, the history list no longer shows results for an older query, and a stale error clears when the page changes.
  • pi-sysadmin's messages and docs no longer point at the built-in Docker App, which is gone; they name the picode-docker extension or describe the actual gap instead.
  • The command palette no longer lists "Open <name>" twice for an extension that both has a page and a command opening it (picode-blender, picode-docker); a page with no opening command still gets its own row.
  • "Open browser" on a waiting page, the sidebar's browser globe and Connect no longer open a second tab of the same agent. They now bring forward the tab the session already has open.
  • A browser command that returned empty text no longer breaks the agent's tool result. An evaluate on a page with no text (for example a Chromium error page) made the client reject the whole answer as malformed.
  • Artifact pages in the dark theme no longer show light text on white when the page has no background of its own.
  • Diagrams on the phone stay readable: a wide Mermaid diagram keeps its size and scrolls instead of shrinking its labels.
  • Closing a Claude Code, Codex or Hermes session no longer shows the agent as Working. When a session ended, on exit or before starting a new one, PiCode read it as the agent being busy. It now shows the agent as Ready.
  • A Codex agent no longer stays on Working after its first turn. Codex runs a background memory task of its own when a session opens, and when that task finished, PiCode read it as the agent being busy again. PiCode now ignores Codex's background tasks, so the agent shows Ready as soon as your turn ends.
  • tabs new answers with the new tab's address while the page is still loading, instead of an empty line.
  • A note the browser tool adds to an answer (a tab the human closed, a link that opened a tab) is on its own line, no longer glued to the answer's first line, in both Pi and MCP tool clients.
  • The wording when you keep the agent's current browser tab as your own now says you took it back as your own tab.
  • Links in an artifact open again. Clicking a link to another site in an artifact did nothing; it now opens where your Browser settings say (a PiCode browser tab by default). Right-clicking a link offers Open link and Copy link address.
  • An Omp agent no longer shows Running forever after its turn ends. Omp 18.4 keeps background helpers of its own alive for the whole session, and PiCode read them as a command the agent was still running, so the sidebar kept a spinner counting hours. PiCode now recognizes Omp re-running itself and ignores it; a command you start with ! still shows as Running.
  • An extension's own icon now shows on its install review, its detail page, and in the workspace and agent menus — it previously showed only on its Apps tile and its tab.
  • The agent screen's monitor no longer lands on "That terminal is gone". Opening a screen docked now brings forward the agent's live terminal tab, and never a terminal that no longer exists. The screen also keeps the last mode you chose (docked or miniplayer) more reliably across restarts.
  • An artifact beside an agent keeps one toolbar row in a narrow pane. Reload and Open in Artifacts move into a More menu, Comment shows its icon, and the close button no longer drops to a line of its own.
  • Ignoring a PiCode request in the Inbox says what happens. The confirmation reads "It closes without an answer" instead of "The agent gets no reply" when no agent is waiting.
  • Inbox: an item's time reads "now" instead of "now ago", and the warning that an answer cannot reach a removed sender shows only on questions and approvals.
  • Resizing the pane beside an agent no longer stalls over a page. Dragging the divider across the browser or an artifact kept the drag stuck; it now follows the pointer to the end.
  • Claude Code forks no longer count their parent's history twice. A forked Claude Code session opens with a copy of its parent's conversation, and the dashboard counted that copy as new spend and new messages. Over the last 30 days on the machine this was measured on, that was $511, about 4,000 messages and 758M tokens counted twice.
  • Handoff copies no longer inflate Activity. A session PiCode writes when you hand a conversation to another CLI starts with the original history. Those messages were counted again in messages and turns. They cost nothing, so spend was not affected.
  • The browser and an artifact beside an agent no longer hide each other. When both are open, the pane shows two tabs, the browser and the artifact, and you switch with a click. Opening the browser from the globe brings it forward, and a new artifact waits behind its tab (with a dot and New · Show beside the tabs) while you are using the browser.
  • Keeping both sign-ins can no longer lose one. With "Keep both" in a Claude Code sign-in, a second kept login without an e-mail was given the same name as the first, so the two rows shared one id. And when the saved login's e-mail was the same as the new sign-in's, the import overwrote the saved credential. The kept login now gets a name no other row and no incoming login has.
  • Who pays: provider icons are no longer cut on the left. In Analytics › Spend › Who pays, the provider icons lost their left edge.
  • Providers no longer lists the same login twice. A login saved once under an older format and again later showed as two accounts, for example a migrated "Default" beside the Anthropic account in use, or three identical llama.cpp rows. PiCode now folds those rows into one when it starts, and keeps a copy of the credential store from before the first cleanup. Two accounts with different e-mails always stay separate. Automatic names no longer repeat, so two keys are no longer both called "Account 2".
  • Resuming a stopped agent opens its own conversation. When several agents of one CLI work in the same folder and PiCode had restarted, stopping one could save another agent's conversation as its own, and Resume then reopened that other conversation. A conversation another terminal holds is no longer taken, and an agent's own conversation that is still in use is kept.
  • Mobile: the row menu drawer scrolls again. The sheet library pins touch-action: none on its content for the drag gesture, so once "Continue in…" unfolded past the screen, dragging scrolled nothing. The sheet hands vertical pans back to the browser's scroller; folding a submenu and dragging the sheet away still work. Applies to every mobile sheet that scrolls itself (row drawer, agent settings, git sheets).
  • Mobile: "Continue in…" in the row menu unfolds in place. Tapping it opens the list of CLIs right under the row (and "Pi" opens its chat and terminal landings), the way the desktop menu nests — instead of dumping every target flat and pushing the rest of the actions off screen.
  • Saving a file an artifact page offers now says where it went ("Saved “checklist.csv” to Downloads.") instead of closing the dialog silently.
  • Pi and Omp now offer their PiCode tools in Customize, like Claude Code and Codex: every tool starts checked, and what you leave checked is what new Pi and Omp agents get.
  • User menu: Artifacts (and Skills in search) have icons again. Both rows rendered without a glyph, shifting their labels left of every sibling — Artifacts wears the book, Skills the star, and a structural test now fails when any menu row lacks an icon entry.
  • Hermes spend is split by who pays. Hermes Agent's spend showed as unclassified in the dashboard's Spend split. It is now counted as API or plan, using the provider and billing mode Hermes records for each session.
  • Customize in a CLI's launch settings (Claude Code, Codex, OpenCode) showed every PiCode tool unchecked while new agents got them all. It now opens with every tool checked, and the tools you leave checked there are what new agents of that CLI get.
  • Restarting an agent failed with "Too many PiCode tools." after the Artifacts tools arrived: saved tool lists still carried the retired Delivery tool. Those lists are cleaned, and the limit no longer trips when a new PiCode tool is added.
  • Hovering a Files document no longer reveals the file tree's scrollbar. Tree and document scrollbars appear only when their own panel is hovered on mouse devices.
  • Apps: web app installs now work on sites behind bot filters. Sites like platform.deepseek.com answered the install probe with HTTP 403 because it identified itself as PiCode and not as a browser. The probe now uses a browser identity — the same read a browser does when it installs a site as an app.
  • Dashboard: spend, turns and sessions of Omp agents created in a workspace are counted. They live in PiCode's own folder for Omp sessions, which the dashboard did not read, so almost all Omp activity was missing.
  • Dashboard: the Spend/Turns and CLI/Model/Workspace switches and the Analytics tabs are one keyboard stop each, moved with the arrow keys.
  • Dashboard: the bar for the period still running is striped in its CLI's color instead of washed out.
  • Analytics: plan names in Limits use the room the row has; Grok and Hermes no longer share greens in the charts.
  • Phone: following the system theme switches live, without a reload.
  • The workspace Overview tab uses the same font as the rest of the page again (sans stays on the Dashboard only).
  • Dashboard: the coverage window shows its key first and draws the "some sessions" mark instead of a font symbol that some fonts shrank to a sliver.
  • Dashboard: top sessions say which CLI, how many messages and when, so several sessions in one workspace no longer look identical.
  • Dashboard: a CLI that spent a fraction of a cent no longer draws the same bar as one that spent dollars.
  • Dashboard: Omp and Grok no longer share similar greens in the chart; limit meters show their empty track in the light theme.
  • Phone: when some CLIs are not priced, Today says so in words.
  • Tab strip: no separator lines beside the active tab or a split's tabs, and no half-drawn blue line on top of a split's focused tab. The separator next to the active tab was meant to hide already and did not.
  • On the phone, going back from an agent or terminal to Work returns to where the list was scrolled, instead of jumping to the workspace's group.
  • An agent whose terminal disappeared without being stopped (for example after the terminal service crashed) no longer keeps running in the background with nothing attached: PiCode ends it when it starts and every ten minutes.
  • On the phone, the New agent and New workspace screens no longer leave a strip of page under their bottom bar.
  • A workspace's tabs (Overview, Agents, Instructions, Settings) fit a narrow window whole instead of cutting one off.
  • On the phone, Sign in to GitHub is a full-size button.
  • Dashboard: comparisons measure the same stretch of time. Today is compared with yesterday up to the same time of day ("vs. same time yesterday"), and 7 or 30 days with the period before up to the same day and hour. A morning used to be compared with all of yesterday and always read as a drop. The phone's Today strip uses the same comparison.
  • Dashboard: cost per line divides only the spend of the CLIs that count the lines they change, instead of every CLI's spend.
  • Dashboard: the Sessions tile no longer draws a sparkline of turns under its label.
  • Dashboard: the Tokens legend keys show the colours of the bar's slices instead of all being grey.
  • Dashboard and phone: a CLI that prices only some turns, and priced none in the period (Hermes on a plan), shows "not priced" instead of "$0.00".
  • Dashboard: while a new period loads, the comparison label stays with the numbers still on screen.
  • Provider logos are visible on dark backgrounds (dashboard model rows, Providers).
  • Dollar amounts show thousands separators ("$3,372.02").
  • Removing a Pi agent that runs in its terminal now closes its tab and moves you to the next tab or Home, instead of leaving the removed agent's chat box on screen.
  • Messages between agents reach Claude Code sessions that have a name. The session title Claude Code draws above its input made PiCode refuse to type into it, so messages to that agent stayed pending forever.
  • Sidebar: the ⋯ menu no longer covers a creator's family chip. On a hovered or selected row of an agent that started other agents, the chip with its children's dots now steps left of the ⋯ button instead of sitting under it.
  • Agent CLIs: Hermes's Checks report is complete. The full report now starts with the top of Hermes's banner, and "passed" counts every check Hermes marked ✓ instead of only PiCode's install check.
  • Missions: the page shows one status line at a time instead of stacking "Connection lost" over the last action's receipt.
  • Phone: a workspace's Settings sheet opened from the Merge view is styled on a first load, instead of showing bare radio buttons.
  • On the phone, notices glide when a sheet opens or closes instead of jumping, and a notice you close no longer drops onto the buttons below it before fading.
  • Starting a Hermes agent with a task: the task no longer fails with "the recipient's terminal is closed"; it waits until Hermes can take it.
  • New workspace accepts a folder typed from the home folder (~/code/my-app, as the placeholder suggests) and a Windows path under WSL; it used to answer "That folder doesn't exist".
  • Adding a folder that is already a workspace says so instead of closing as if it had made a new one.
  • A clone, or a new repository on GitHub, keeps going when the tab reloads or closes; the workspace appears when it finishes. A reload used to stop the clone and could leave a repository on GitHub with no workspace.
  • On the phone, notices shown while a sheet is open no longer touch the sheet's buttons, even when two are stacked.
  • On the phone, a save notice no longer covers the last setting on the page: settings pages and the agent's Settings sheet leave room at the end, so the row you just changed stays clear of it.
  • On the phone, notices raised while a sheet is open now appear above the sheet, and tapping one no longer changes the setting underneath or closes the sheet.
  • On the phone, moving back up through a page's controls with the keyboard no longer hides them under the page header.
  • Saving a Pi setting no longer pushes the page down: "Saving…" and "Saved." now sit in the line under the agent's name.
  • Fork on the phone runs the project's setup, like the desktop: it asks to trust .picode.json first, runs setup in the new worktree and offers Start anyway if it fails.
  • A stopped Pi agent's conversation shows on the phone. After a start that failed (or any stop), the phone used to show an empty chat while the desktop showed the messages and the error.
  • A merge's checks now run on the change itself, not in whatever folder the run started from, and a target branch that moves during the checks is never overwritten.
  • A worktree agent's Changes panel shows its own worktree. It used to switch on its own to the main checkout's edits ("Following main"); the main checkout is now only offered on the line below.
  • Retrying a project's setup reuses its terminal instead of adding another "· setup" row to the sidebar each time.
  • Browser tool: type's answer shows the field's text exactly, spaces included.
  • The Inspector's branch chip keeps the end of a long branch name visible: feat/bottom-dock in a narrow rail reads f…/bottom-dock instead of feat/bottom-d….
  • The browser tab's address field hint ("Enter a URL") stays readable after switching between light and dark theme.
  • The Settings link in a Pi terminal's launch settings now looks like a link.
  • Workspace Settings… saves again. Renaming a workspace or changing its landing rules no longer fails with "Invalid input", on desktop and on the phone.
  • Handing a conversation to Pi or Omp with an ID that already exists is refused every time, instead of creating a second copy of that session a second later. New session files are named with real milliseconds, like the ones Pi and Omp write themselves.
  • Browser tool: in the desktop app, a stale element name after the agent's page moved to another site now says so plainly instead of a raw error, and opening the browser no longer answers "the page has no accessible content".
  • A stopped Pi agent shows the task it will start on. An agent created with a first task used to open on "What should we work on?"; its chat now shows the queued task, and on the phone a Start agent button next to it.
  • A worktree agent's status bar shows its own folder and branch, not the workspace root's.
  • Keyboard screens: short action names no longer break in two. On a narrow window or the phone, the keys wrap instead; the "press a key" hint fits on one line, and a thin line now separates the toolbar from the rows scrolling under it.
  • On a busy machine, a workspace or agent with uncommitted changes no longer flickers to "clean" (or loses its branch) when git status is slow: PiCode keeps showing the last reading until a fresh one arrives.
  • Agents report on missions on the first try. The mission tool now tells an agent which details each step needs and where to find them. If something is missing, it names everything in one answer instead of one refusal per detail.
  • Fork no longer leaves a worktree behind when it can't fork. The Fork dialog says why as soon as it opens (for example "This agent has no conversation to fork yet"), before anything is created.
  • A project's setup is approved once. With an uncommitted change to .picode.json, New worktree asked to trust the file twice; it now asks about the copy the new worktree gets.
  • A setup's terminal says how it ended — "setup finished" or "setup failed (exit N)".
  • The sidebar's "Idle · N" line has the same height and text column as the other section labels.
  • The sidebar and the phone show the plan of a CLI agent that reports it through its terminal.
  • The phone's Needs you cards show the command an agent asks about and what it is ("Waiting in its terminal"), not a code fence and a reason code.
  • The phone says Ready, like the desktop, and its Pinned label is no longer upper-case.
  • The dashboard reads "1 needs you".
  • A git command from the graph, Fork or New agent could be typed into a terminal whose shell was busy with a long-running command started by a script; PiCode now opens a fresh terminal instead.
  • The bottom panel shows on the dashboard. Its button looked pressed there while the panel stayed hidden.
  • The top bar keeps its panel buttons with no tab open (desktop app): the browser and bottom panel buttons no longer disappear with the last tab; they sit next to the window buttons.
  • No Inspector button on the dashboard, where the Inspector never shows: it looked pressed and did nothing.
  • Pi agents in a folder under your home. Messages, missions and automations sent to such a Pi agent no longer wait forever: PiCode now recognizes Pi's prompt when the folder shows as ~/….
  • Delivery receipts. A message or prompt sent to a CLI that starts working right after the Enter no longer reads "not confirmed" when it arrived: the CLI's own report that its turn began now counts as delivery.
  • Completed Missions keep accepted results, evidence and former executor history clear after folder or agent cleanup, on desktop and mobile. Active and reopened Missions retain resource warnings; cancelled Missions retain release safeguards.
  • Desktop browser: your browser settings hold after the desktop app restarts. "Ask where to save" downloads, password saving and autofill fell back to their defaults after a restart until you opened Browser settings; they now apply as soon as the app starts.
  • The bottom panel stays at the bottom of an agent tab whose browser is open beside it. It used to take the top-left corner, above the agent, and push the browser down, leaving a blank block at the top right.
  • Status ages in the sidebar meet AA contrast in both themes.
  • Browser keyboard actions now send control-key attributes understood by terminals, including Enter. Click, type and press report their action result instead of a misleading page-loading message.
  • Recovery prefers an existing feat/<slug> worktree branch over a legacy <slug> branch, explains when it must start from the current checkout, asks users with an existing folder to choose a workspace before restoring, and clears a resolved wait error when that folder appears.
  • Pinned Codex resume keeps the applied sandbox and approval policy, and refuses before restore when the original policy is missing or ambiguous so the exit and transcript remain available; other CLIs make no new safety-preservation promise.
  • Inbox: a mission that asks for review again no longer adds a second "Review" row. The earlier request closes with a note saying it was superseded. Accepting, requesting changes or cancelling on the mission page also closes the open review notice.
  • Confirmation dialogs put keyboard focus on Cancel when they open; before, focus stayed on the button behind the dialog.
  • Sidebar: the PiCode logo shows in light mode. At the default sidebar width the header drew the logo in white on the light background, so it could not be seen. It now sits on its dark tile next to the name, as in the desktop app's top bar, and a narrow sidebar keeps the tile alone.
  • Tall menus show that there is more. When a menu is taller than the window, such as the machine menu, its edge fades while more items lie past it, and the fade clears once you scroll to that end.
  • Browser: an agent's raw protocol call (cdp, Developer mode) now runs in the browser beside its own session. It used to look for the tab you had on screen and failed with "no work-browser tab is open", or would have run in your page. Methods outside the built-in catalog now reach the page too.
  • Desktop browser: an agent using its browser never takes your tab. Every click, type, snapshot or screenshot used to reselect the agent's tab, so you could not use another agent while one was browsing. Now the agent works in the browser beside its own tab whether you are looking or not — opening the browser included — and you see its page when you open that agent, from the sidebar or its terminal tab. Links that open a new window stay in the agent's page instead of jumping to a new tab, new pages no longer grab the keyboard, screenshots of a page you are not looking at are taken without bringing it forward, and a page the desktop app lost on restart comes back at its last address. New windows and keyboard focus need the updated desktop app. Closing an agent's browser now keeps it closed: the agent cannot reopen it until you open it again from the globe.
  • Antigravity and OpenCode sign-ins no longer lose their window when the sign-in page opens in a PiCode tab: coming back to that CLI's Providers reopens the window where you left it, with the field to paste the code (or the device code to enter) and the time left.
  • Going Back from an OpenCode sign-in that waits for a pasted code now cancels it, so the next sign-in is not refused as already in progress.
  • Phone: a CLI's Models roles (Omp) use the full width — the model picker and the thinking level end at the same edge as the rest of the page.
  • Phone: Pi Settings' Defaults fill the row — the provider on its own line, the model stretching beside the thinking level — and end at the same edge as the other fields.
  • Pi Settings: the "All models" line under Scoped models lines up with the field above it.
  • Grok, Hermes and OpenCode runs find their own conversation. Even when the CLI's hook names no session file, PiCode looks where the CLI keeps it, so the run's cost, its answer and the agent's Outcomes row are not left empty.
  • If PiCode's llama.cpp supervisor process is killed, the models its server had loaded are now stopped instead of staying in memory.
  • Package configuration pages keep your unsaved edits when you switch layers. On a page like pi-roles, switching between the workspace and the agent layer dropped the draft you had not saved yet; each layer now keeps its own until you save or discard it.
  • Phone: the Connectors Marketplace toolbar is aligned. The layer switcher and the button beside it share one height when the row wraps.
  • A missing agent skill shows on the agent. When PiCode's copy of an agent's own skill is gone, the agent's row says so and opens its Skills chip; unused copies are cleaned up (kept while a removed agent can still be brought back).
  • Prices no longer turn into formulas in markdown previews. Text like "it costs $5 and $10" is shown as written instead of as math.
  • A broken Mermaid diagram no longer leaves its error drawing behind. The error graphic could pile up at the bottom of the page and shift it.
  • Clearing large llama.cpp model files no longer freezes the local service page and model actions while PiCode checks the files.
  • Sending to Grok 1.0.41. PiCode read Grok's empty input box as holding a draft, so messages and automations to Grok were refused with "Finish or clear the draft"; it reads the new screen now.
  • Packages no longer shows an empty strip between the Installed/Marketplace tabs and "Nothing installed." — the filter bar appears only when there is something to filter.
  • Phone: a CLI's Packages "install by source" field shows its whole example; Install now sits under it instead of squeezing it.
  • An Omp fork's task keeps its layout. Forks of Omp agents now get their task once Omp is ready, like every other CLI: line breaks kept, any length, and a restart before the first answer no longer sends it again. Messages to an Omp terminal from the phone are recognized at the phone's width too.
  • Phone: the missions list's "Include archived" filter is a full-size row — a larger checkbox and a 44px tap target that includes its text.
  • Phone: New mission no longer opens with an empty band and a stray divider under the header.
  • Sending to a Pi terminal from the phone. With the phone attached, PiCode now recognizes Pi's prompt on the narrow screen, so a fork's task and messages sent from the phone are delivered and confirmed instead of being refused or typed blind.
  • A fork's task keeps its layout and is sent once. Forks of Claude Code, Codex, Grok and OpenCode agents now get their task after they open, the way Pi and Muse Code forks do: line breaks are kept, long tasks are fine, and restarting the fork before it answers no longer sends the task again. Omp forks still get the task on one line.
  • Removing a workspace closes every agent's terminal pane, not only the first agent's.
  • No more runaway tmux helper. A terminal whose PATH held two PiCode instances' helpers (a test instance opened inside PiCode) could leave a helper process spinning at full CPU; each helper now skips the others and reaches the real program.
  • Sending to Claude Code 2.1.282 and Codex 0.157. Their composers changed (a word-by-word suggestion, a new effort row, a shortcuts row), so PiCode could not confirm a message reached them; it reads the new screens now.
  • A Pi fork gets its task in seconds. A forked Pi agent sat on "Starting Pi..." for about half a minute before showing the conversation and receiving its task. It now opens in a second or two and the task follows right away.
  • SSH guide: the attach commands now name PiCode's socket (tmux -S ~/.picode/tmux.sock …); a plain tmux ls asks a server PiCode does not use.
  • Omp agents' conversations show in a workspace's Sessions view. Scoped to a workspace, the Omp Sessions list now includes that workspace's Omp agents, and each opens where it was left; the one an agent is on shows "in use" and opens that agent.
  • Phone: the Backup folder field shows its whole placeholder; Browse and Reveal now sit under the path instead of squeezing it.
  • Continue in… works on Omp agents. A workspace Omp agent's conversation can now continue in another CLI; the dialog no longer says the session is not on this machine.
  • The account chip no longer says "local" for a moment before your machine's name loads; it shows a placeholder until then.
  • Keyboard focus on buttons draws the theme's accent ring instead of the browser's default outline.
  • Preferences no longer draws a second divider under its tabs.
  • On the phone, Preferences reopens on the tab you last used instead of Appearance.
  • On the phone, a settings tab you scroll fully into view can be tapped again (it could stay hidden after a swipe — Preferences → Landing work was unreachable).
  • The tmux app's tabs no longer show a "0" count badge when a tab has nothing to count, and the Sockets list no longer repeats its count as "N socket(s)" beside the header.
  • A malformed Add provider link is refused. #/clis/<cli>/providers/new/<extra> opened the Add provider dialog; it now reads as an invalid link, like any other path after the pane.
  • Connector sign-in returns to the right pane. After an MCP server's browser sign-in, the success page's return link opens that CLI's Connectors pane with the workspace and agent you started from, instead of a retired address.
  • The HTTPS certificate now covers 127.0.0.1 and ::1, not only localhost. A tool or script that reached PiCode by the loopback address got a certificate error. New certificates include both. Running picode provision reissues an existing one that lacks them, from the same local certificate authority, so browsers keep trusting it. Every name the old certificate had, such as a Tailscale name or a LAN address, is kept.
  • Skills linked for Claude Code no longer read as "edited". A workspace skill that Claude Code sees through a link was fingerprinted as the link itself, so its row said it had changed since it was installed.
  • Desktop: the window no longer gets stuck on "PiCode is not running yet". The desktop window now opens right away on a waiting screen that says what is happening: Linux starting, PiCode starting or restarting, PiCode not answering, or a certificate Windows doesn't trust yet. Each stage has one action (Try again, Start PiCode, View logs, Trust certificate) and a running timer while something is in progress, and the window switches to PiCode by itself the moment it answers. Before, the page promised a retry it never made, and the window could take up to 30 seconds to appear. The screen has its own title bar, so it can be moved, minimized and closed.
  • Missions now puts Read evidence beside the review actions on desktop and mobile. Criterion reports are easier to read, historical evidence entries expand, and file names in notes are labeled as references rather than attachments.
  • Resuming a Muse Code conversation (Resume last session, Continue in… to Muse) uses muse resume <id>; Muse Code 1.3.0 refuses the older --resume flag.
  • Attach: Omp follow-ups keep their lines. A follow-up sent to a working Omp arrives as one message with its line breaks, so a numbered list no longer splits into several follow-ups.
  • Attach: Hermes follow-ups say they are queued. Hermes Agent shows a follow-up only when its turn ends; the composer now says so instead of warning that the message could not be confirmed.
  • Attach: Stop and send works on an Omp that has not answered yet. Stopping Omp before its first output used to be reported as not stopped; PiCode now sees the stop and sends the message.
  • Claude usage shows again after you sign in to Claude Code. The Anthropic account PiCode reads usage with now follows Claude Code's own login, so signing in again (in PiCode or inside Claude Code) replaces the old login instead of leaving "sign in again" on screen. PiCode also stops renewing that login itself, which could sign Claude Code out.
  • Omp, Grok, Hermes Agent and Muse Code now show the ••• lifecycle menu (Check for updates, Reinstall, and Uninstall where the vendor offers one) on Agent CLIs, like the other CLIs. PiCode's own terminal shims for those four were mistaken for the real binary when detecting the install method, so the page reported "no managed lifecycle" and hid the menu. The shim header check now recognizes every shim PiCode writes, not only the intercept ones.
  • Packages and Connectors after Skills. Opening Packages or Connectors from a Skills tab that had the workspace or agent chip selected showed "This package link is invalid" (or the connector one). The chip you had selected now carries over to the next tab in that tab's own terms.
  • Pi wears its official mark again. The Pi favicon had drifted into a neutral grey re-ink; it is pi.dev's own art at the official ink now — near-black on the light theme, near-white on the dark one — everywhere a CLI favicon renders (sidebar, tab strip, notices, the Agent CLIs catalog, the phone's Work rows).
  • The agent's chip in Skills for Claude Code and Omp agents. Opening a CLI's Skills tab while a Claude Code or Omp agent is selected now offers that agent's chip, as it already did for Pi; the phone's Skills shortcut carries the agent too.
  • Outcomes name the model of every agent. A removed Claude Code, Codex, Omp or Muse Code agent's record now says which model it ran — the one its sessions used most — instead of leaving the model blank.
  • Agent history finds sessions from Omp agents launched by PiCode in their private session directories.
  • Sidebar: agent CLI favicons now match the tab strip in both themes. The white chip that dressed Claude, Codex, Grok, OpenCode and Hermes marks on the dark sidebar is gone — every CLI favicon renders full bleed and recolors with the theme (light marks on dark, dark marks on light), the same art the tab strip wears. The collapsed workspace face strip separates its marks with a small gap instead of overlapping them into a smudge.
  • The public changelog preview now shows new entries after a release cut when the prior Unreleased section was consumed.
  • Instructions: Antigravity reads its files after all. The earlier entry that its cells now say "unknown" was wrong: Antigravity reads GEMINI.md and AGENTS.md from the start of a session, but only in a folder you trusted in it — that exact folder, not the folders inside it. The page now shows "reads" or "not trusted" accordingly, and says when a folder needs trusting.
Segurança · 3
  • Backups no longer carry the old plaintext credentials file. PiCode stopped reading ~/.picode/accounts.json — every vault had already absorbed it — so an emptied vault can no longer bring old keys back, and snapshots neither copy nor restore that file. A leftover copy on disk is yours to delete; a snapshot from before the encrypted vault restores without its credentials.
  • The local API no longer answers other websites' requests. A page open in another tab, or an HTML file shown in the preview pane, could make PiCode on this machine create or refresh a sign-in session just by loading an image from it. Requests from other sites are now refused, and only PiCode's own pages (or a script with no browser at all) are signed in automatically on this machine.
  • PiCode answers only to names you actually use. It used to accept any .local or Tailscale name, and this computer's name followed by any domain. Now it accepts the addresses it always accepted (localhost, IP addresses, picode.local), this computer's name on your home network or tailnet (including Tailscale's name-1 style), and every name on your PiCode certificate. If you reach PiCode by another name, set that address as the public URL in Preferences → Server.

0.7.0

38 novos · 17 melhorias · 47 correções

Novo

  • Stop and send. The attach box has a fourth way to deliver a message to a busy agent: it stops what the agent is doing, then sends your message as a new request. It works with all nine agent tools and is never picked for you. If the agent does not stop, nothing is sent and you are told so, so you can try again.
  • Agent history on the phone. More ▸ Agent history lists removed agents whose conversation is still on disk. Bring back (to any workspace) and Remove from history work there too.
  • Outcomes remember the instructions. A removed agent's record lists the instruction files it read (AGENTS.md and the like), each with a short fingerprint of its content, so two agents that ran on the same instructions can be told apart from two that did not.
  • Draft with an agent. A workspace with no instruction file offers to have an agent write its first AGENTS.md: the New agent dialog shows the exact request, lists the agents that can start with one, and the file waits in the Git tab for your review.
  • The docs site "Development flow" guide lists its six phases — Elaboration, Iteration, Closing docs, Landing, Deploy, After deploy — under "On this page", and each phase heading has a working permalink anchor.
  • Workspace overviews now highlight questions, blocked and review-ready missions, waiting agents, and failing pull request checks, with a seven-day activity summary and recent commits.
  • Agent rows show Compacting while Codex, Claude Code, Grok, Pi, Omp or OpenCode reports native context compaction.
  • Open a workspace overview from its sidebar menu to see requests, agents, project state, missions and activity for that workspace without opening an editor tab.
  • A delivery says which objective it serves. When a mission cites a change as evidence, the Delivery view's row and detail now name that mission — its title, its own state ("Ready for review") and a link back to it — and the read carries the same map for any surface that needs it. The link is exactly the one Missions stores, read backwards: read-only, no new schema, and it transfers no integration authority.
  • The read reports when the mission list was too long to invert completely, instead of passing a short answer off as a complete one.
  • Steer or follow up while a CLI is working. The message bar under an agent's terminal (desktop and the phone's sheet) no longer shuts while the CLI is busy: it offers Steer (reach the running turn) or Follow-up (wait for the turn to end), in whichever of the two the CLI supports. Pi, Omp, Hermes, Muse Code and Codex offer both; Claude Code and OpenCode offer Steer; Antigravity and Grok offer Follow-up. A CLI asking for your answer, or one with a half-typed draft, still refuses. The receipt says Queued when the message shows up on the screen, and Unconfirmed when PiCode cannot see it yet.
  • Quick sorts in the workspace menu. "Sort agents by name" puts a workspace's agents in alphabetical order — one saved reorder, the same on every device, and you can still drag rows afterwards. "Working first" is a per-device view that groups the agents of a workspace under what they are doing: Needs you, Working, In terminal, Ready, Stopped — who needs you stays on top while the saved order stays underneath, untouched. Both live in the workspace card's "…" menu and appear once the folder has more than one agent.
  • Add, update and remove skills. The Skills tab's Add skill reads a GitHub repository, a site's skills index or a local folder, shows each skill's files, format problems and what the safety scan noticed, and installs the one you pick into the workspace or this computer, where most agent CLIs read it. Check for updates compares installed skills with their sources; Update and Remove ask before touching your edits. Installs are recorded in the same lock files the skills command-line tool uses.
  • New agent on the phone shows the same line as the desktop: which instruction files the picked CLI reads in that workspace, and which it leaves out.
  • Agent history. Removed agents whose conversation is still on disk are listed at user menu ▸ Agent history (#/history, also in the palette). Bring back restores the agent with its setup and resumes the same conversation — Pi and every other CLI — into its workspace or another one, in the folder it worked in. Environment variable values are not restored; the toast names the ones to set again.
  • Remove from history hides a removed agent from the list. For a Pi agent you can also delete its conversation file; other CLIs' files are never touched.
  • A forked agent's row in the sidebar (and in the phone's Work list) reads fork of &lt;name&gt;, and (removed) once the original agent is gone.
  • Missions preserve objectives, criteria, decisions, checkpoints and evidence across agent sessions, with browser and mobile views, Inbox answers, explicit executor transfer and owner review.
  • Mission reporting is available through the CLI and MCP, with assignment/session checks, durable history, visible submission uncertainty and acceptance tied to current evidence. The native pilot exercised Codex and Claude Code; other providers have not been validated live.
  • Fix instruction files from the Instructions tab. A CLAUDE.md that only tells Claude Code to read AGENTS.md gets a Review change button that adds an @AGENTS.md line, and Add personal file creates CLAUDE.local.md or AGENTS.override.md and adds it to .gitignore. Every change is shown as a diff first, is written only when you confirm it, and is never committed.
  • Skills tab for every agent CLI. Agent CLIs → a CLI → Skills lists the Agent Skills that CLI loads: the folder it found each one in, which copy wins when two share a name, who installed it, what it costs at every start, and whether the workspace must be trusted first. Read-only for now.
  • The desktop Management window's Disk tab shows a History chart of the Windows drive's free space and the space used inside the distro, one point per day, and lists what grew most in the last seven days. PiCode Desktop records a day on every scan and once a day in the background.
  • Outcomes on the phone. More ▸ Outcomes lists every removed agent with its answer, lifetime and cost; you can answer later, delete a record, or turn the question off.
  • What agents here read. The Instructions tab lists, for each Claude Code, Codex and Grok agent in the workspace, the instruction files its latest session actually loaded, read from the CLI's own session record.
  • Outcomes shows what each removed agent cost. The record keeps its sessions' cost and tokens, read at removal; list-price estimates are marked with ~, and agents whose CLI PiCode cannot read show "—" rather than $0.00.
  • The desktop Management window can move the distro's disk to another drive (Move here) or back it up as one .vhdx file (Back up here), from the System tab. Each drive shows its free space. A drive that cannot take the disk stays listed with the reason. Nothing stops unless the copy fits.
  • The Agent CLIs guide explains Fork agent…: when to fork into a new worktree or the same folder, and which CLIs can fork.
  • Instructions settings. The Settings page of Claude Code, Codex, Hermes and OpenCode has an Instructions group: which instruction files Claude Code reads (CLAUDE.md, AGENTS.md or both), the extra file names and size limit Codex uses, Hermes's size limit, and OpenCode's extra instruction files. A finding in the Instructions tab whose fix is one of these opens that page.
  • OpenCode's Add provider follows OpenCode's own sign-in, without a terminal. You pick from OpenCode's catalog of providers, choose one of OpenCode's methods (ChatGPT, GitHub Copilot, GitLab and more), answer its questions, then paste a key or finish on the provider's page. OpenCode keeps the credential in its own store.
  • Abandon on a llama.cpp operation whose result is unknown: PiCode stops following it and frees the model, without sending anything to the server.
  • The desktop Management window has a Distro tab for the distro's own settings file, /etc/wsl.conf: systemd, the default account, the Windows PATH, drive mounting, the host name and DNS. It saves as the distro's administrator without a password, keeps the previous file as /etc/wsl.conf.bak, and offers Restart WSL to apply.
  • The Clean tab also lists the system's own caches (apt packages and system logs) and cleans them as the distro's administrator.
  • Agent instructions. A workspace's … menu opens Instructions: for every installed agent CLI, which instruction files (AGENTS.md, CLAUDE.md, GEMINI.md and their kin) it reads in that workspace, which it skips and why, with findings such as a CLAUDE.md that keeps Claude Code from loading AGENTS.md, a file over a CLI's size limit, or a folder Grok does not trust yet. The New agent dialog shows the same answer in one line for the CLI you pick.
  • Antigravity's Add provider signs you in with your Google account from PiCode: open Google's page, then paste back the code it shows, within the minute Antigravity allows. A new link is one click away.
  • The desktop Management window has a System tab. It shows how much memory WSL may use and is using, what Windows holds for it, swap, and the installed WSL version. A newer WSL release is offered as Update WSL, and Restart WSL applies saved settings. Both ask first, refuse while an agent is mid-turn, and say that every session inside WSL ends.
  • After saving WSL settings, the Config tab offers Restart WSL to apply.
  • Fork agent… in a CLI agent's sidebar menu starts a new agent of the same CLI on a copy of its conversation (Claude Code, Codex, Grok, OpenCode and Omp, each through its own fork), with a task you write in the attach composer (photos, files, sketches). The copy runs in a new worktree on its own branch or in the same folder, and the original agent keeps running.
  • Muse's Add provider opens its own sign-in: your Meta account with a one-time code, or a Meta API key. No terminal is needed, though signing in from one is still offered.
Melhorias · 17
  • Instructions: Muse Code, Antigravity and Omp measured. Muse Code's rules are confirmed by a run. Antigravity's cells now say "unknown": in PiCode's runs of 1.2.10 no GEMINI.md or AGENTS.md was in a new session's context, although its docs say it reads them. Omp's .agent/AGENTS.md now wins a tie with .agents/AGENTS.md, as Omp does.
  • The message bar's Delivery choice (Steer, Follow-up, Stop and send) now sits in the message row, right before the send button.
  • The Development flow guide's "When the flow bends" cards are checked against the repo scripts that print them. make docs-check fails when a card's quoted wording and the message in its script no longer match, and names the card and its line in the guide. Example values, and the Vale and dead-link cards, are checked only as far as this repository's own files go; the guide says which parts are not checked.
  • Workspace overviews now show a short, prioritized agent summary with current work and contextual actions. A workspace route provides the complete searchable agent list, with unbound terminals shown separately.
  • Skills scopes read like every other setup pane. The chips run Global, then the workspace by its name, then — for Pi and Omp — the selected agent by its name, which shows what that agent loads. "This machine" is now "Global", in the tab and in Add skill.
  • Undo after removing an agent and Bring back in Agent history now do the same thing: the agent returns running, with its conversation, and the same message.
  • "Working first" also ranks by how long an agent has been waiting. With the view on, the groups of agents that are not working (Ready, Needs you, In terminal, Stopped) now order by the time in each row's status pill — the agent that just entered its status first, the one parked longest last. Agents in the Working group keep their saved order, and with the view off nothing changes.
  • Agent history loads in a fraction of a second even with gigabytes of Claude Code and Codex sessions. A brought-back agent is the same agent: automations and pins that named it work again.
  • Instructions opens as a page, not a tab. A workspace's … menu ▸ Instructions opens #/instructions/<workspace> over your tabs, like Agent CLIs, with Back and the workspace named at the top.
  • The desktop Inbox page now uses Back beside its title, consistent with Agent CLIs, instead of a Close button.
  • Moved Inbox out of Apps into a dedicated desktop sidebar button with its own pending badge; desktop and phone now use the core Inbox API, and old Inbox app links continue to open the same items.
  • Sidebar status pills show how long the agent has been in its state — Ready · now, Ready · 5m, Open · 2h, Stopped · 3d — not only while Working. The age is the moment the state actually began: a CLI agent's own hook report for terminal rows, and a managed agent's start/stop and turn settle (a new agent.settled update, applied live without a refresh) for the rest. Where no truthful timestamp exists the pill shows the label alone; hover carries the full time. Mobile status chips no longer clip the age text.
  • Expand the Missions guide with its lifecycle, every control, evidence rules, transfer checks, and recovery steps.
  • Searchable pickers across the desktop app mark the current value with a bar instead of a tint, so the row the keyboard is on stays easy to tell apart; a picker without a search field takes keyboard focus as soon as it opens.
  • The Packages menu entry now says "Plugins, extensions, updates"; standalone skills have their own tab, reachable from search as Skills.
  • Fork agent… into a new worktree no longer waits for you to press Enter when other agents are working in the repository: creating a worktree touches none of their files, so PiCode runs that one command right away. Every other git command still waits while agents work.
  • Agent CLIs panes name the workspace they are bound to. The layer switcher in Settings, Models and Memory, the "Comes from" column in the Checks card, the scope radios in Packages, the save-to options on setting rows, and the connector-package tags all read the workspace's name — Global / QA — where they used to say the generic "This workspace". A pane bound to no workspace keeps the generic word. The guest packages driver now keeps a scope's qualifier when it names the workspace, so Claude Code's uncommitted layer reads <workspace> (local) instead of a second bare <workspace> radio.
Correções · 47
  • Mission CLI/MCP writes now name a missing generation, expectedVersion or requestId before contacting the daemon. Read actions remain available without those fields, and stale-generation refusals are unchanged.
  • An agent running a shell command no longer looks Ready. A command typed with ! (such as !make deploy) or left running in the background now shows Running in the sidebar, with the command's name on hover, in Claude Code, Codex, Grok, Hermes Agent, OpenCode, Pi and Omp.
  • On the phone's Outcomes, an open record keeps its name visible above the details. Before, long paths squeezed the header away.
  • Undo after removing an agent now brings back the same agent with its conversation (a Pi agent's chat was empty, and other CLIs came back without their session).
  • Agent history shows when it is loading or refreshing and keeps the previous list visible if a refresh fails.
  • Recorded Codex, Claude Code and Omp conversations load faster by checking their saved file before scanning the CLI's session store.
  • Keep a live Codex terminal running when its announced session has not been saved, and resume Omp agent sessions from their private files during Restart.
  • Show Compacting beside the agent name in the sidebar, with enough room to read both the name and status at the default width.
  • Windows builds again. internal/server used Unix-only process calls (Setpgid, syscall.Kill) in the GUI sign-in paths, so it had not compiled for Windows since they landed — the leg that checks that only runs on tags and manual runs. The calls live behind per-platform files now, the way the agent-stop and zombie helpers already do.
  • A folder that is gone still counts as its workspace's own. The dashboard attributes a session's recorded folder to a workspace by comparing canonical paths; a folder that no longer exists could not be canonicalised at all, so on macOS — where /var symlinks to /private/var — it matched nothing. The deepest existing part is resolved and the rest re-appended.
  • The public API reference no longer quotes an operation count ("200+") that drifted behind the generated spec (387 paths); the count line is gone and the spec stays described as generated from route registration.
  • The Antigravity sign-in works on macOS. It runs under a pty through script(1), and the flags it used are util-linux's — macOS's BSD script answers them with its own usage line, so the sign-in answered 502 there. The invocation is platform-aware now.
  • A home behind a symlink shows as ~/… again, and Grok's trusted folder is found. On macOS /var points at /private/var, so the paths the instructions report (resolved) and the home they were compared against (as typed) disagreed; the abbreviation missed and a trusted folder read as untrusted. Both sides are resolved now.
  • A terminal whose shell was already gone no longer stays in the list. The creation check races the shell's own start and exit, so under load a dead shell could be accepted and left behind as a row that answers "no server running" to everything. A second check, which nobody waits for, reaps a just-created terminal whose session is gone — the promise is now that a terminal which never lived does not *survive*, not that it is refused on the spot.
  • Dragging a workspace no longer breaks the sidebar. Pressing a folder header to drag it now collapses the folder for the gesture and releases the pinned headers, so the drag slot stays small and nothing detaches or vanishes mid-drag. On drop the folder re-expands and pinning returns; a plain click still toggles the folder as before.
  • Exclude surrounding Markdown punctuation from terminal links opened with Ctrl+click.
  • The workspace header stays put while you scroll. Scrolling a long folder's agent list no longer carries the folder's name, chevron and actions out of view — the header holds the top of the list until the next folder's header takes over.
  • The desktop Management window measures the pnpm store, the Go caches, npm and uv where each tool keeps them. Before, a pnpm store outside ~/.cache/pnpm showed as a few KB and cleaning it never changed the number.
  • Saving WSL settings in the Config tab no longer leaves two copies of a setting that appeared under both [wsl2] and [experimental]. It also no longer shows a value from a section WSL does not read.
  • Give back held space no longer lets Windows restart the distro during the conversion.
  • The desktop Management window uses PiCode's own compact scrollbar instead of Windows' light default with arrow buttons.
  • Removing a Claude Code, Codex or Omp agent that did work now asks "How did it go?". Their turns were never counted, so every removal was treated as idle and skipped the question. Removals from before the fix can still be answered from Outcomes.
  • While a WSL update, a move or a backup needs the distro stopped, PiCode Desktop no longer starts it again with its keepalive or server discovery.
  • Workspace names containing $ sequences (for example $&) now render literally in the Agent CLIs scope labels instead of being read as replace patterns.
  • An operation left unknown on PiCode's own llama.cpp service no longer blocks starting that service forever: while the service is not running, its operations end as Interrupted.
  • After PiCode restarts, an unload whose model is still loaded ends as Interrupted instead of waiting forever.
  • Finishing a large download no longer holds up other model operations while PiCode checks the file.
  • Leftovers of an interrupted llama.cpp install are cleaned up at start.
  • A download that started is no longer reported as failed when PiCode could not record its file baseline.
  • Fork agent…: pasting a screenshot or a file into the task box now attaches it, as in the terminal's attach bar.
  • Fork agent…: when another agent is working in the repository, the dialog no longer covers the git terminal where the worktree command waits for Enter; it closes, a message says to press Enter there, and the fork starts as soon as the worktree exists.
  • A git command from the graph or from Fork agent…'s new worktree no longer picks a stopped or idle agent's terminal as its shell (the server refused it with "This is an Agent CLI"); it goes to a plain shell in the folder, or a new one.
  • The llama.cpp page checks a server that does not answer in about 4 seconds instead of 18, and Save connection is no longer blocked while it checks.
  • Connection problems now say what they are — nothing listening, name not found, untrusted certificate, no answer in time — instead of one "Cannot reach the server" for all of them.
  • The Models tab says why a configured server cannot be managed, and picking a Hugging Face repo shows that it is being read; a slower earlier pick no longer replaces a later one.
  • A quantization whose size Hugging Face does not report is listed instead of dropped (the recommended Q4_K_M could vanish).
  • Adding llama.cpp no longer says "Signed in" before anything was checked.
  • The download dialog's quantization rows no longer overlap; each row's Download button lines up on the right.
  • Model pickers no longer show another llama.cpp server's models, or none, for up to 30 seconds after you change the server address; a model you just loaded or unloaded appears at the next read, and starting or stopping PiCode's own llama.cpp service refreshes the list.
  • Cleaning caches from the desktop Management window works when the tool is installed only for your account. Before, the Go build cache, the uv cache and the pnpm store failed with "go is not installed" (or uv, or pnpm), even though your terminal runs these tools fine.
  • Third prose-audit wave (native surfaces and apps): ten stale path references in the Canvas architecture doc now point at the browser bundle where that code lives (CanvasSurface, PatternSwatch, GrantedContacts, useAgentSocket, fileDocs, nativeApps, routes). work-browser, computer-tool, chrome-extension, file-preview, docker-app, docker-maintenance and tmux-app verified clean — including the 23-action computer catalog, the Docker monitor limits (30/60/300 s cadence, 32 projects, 128 containers, 7/30-day retention) and the preview ticket mechanics.
  • The Pi icon no longer shows as a white square in the dark theme or disappears in the light one: PiCode draws Pi's mark itself in a neutral grey instead of loading a favicon that follows the operating system's theme.
  • A notice with an action row (such as "Removed … Undo") keeps its close button in the text row instead of on the divider next to Undo.
  • In dialogs, a Cancel button beside Remove now shows its outline in the dark theme.
  • Destructive buttons' red text in the light theme is darker, so it meets the contrast minimum.
  • Choosing a key for Muse no longer loses an account login made in Muse's own terminal. It is kept in the vault first.
  • Second prose-audit wave (Agent CLIs stack) brings the launch docs back in line with the code. cli-terminal-launch.md no longer teaches the removed POST /api/clis/<cli>/terminals route (sessions open through the handoff door or the one agents door), names all five npm-backed installs, describes Muse Code and Antigravity as the full rows they now are, and lists the current pane set — Memory for the six CLIs with a native memory shape and Models for omp.

0.6.0

30 novos · 20 melhorias · 47 correções

Novo

  • Removing an agent asks how it went. The remove dialog, on the desktop and the phone, asks an optional question — Resolved, Partly, Didn't resolve, Just trying — and, when it did not go well, what got in the way. It never blocks Remove, it skips agents that never worked or lived under a minute, and Stop asking turns it off.
  • Outcomes page. The user menu ▸ Outcomes lists every removed agent with your answer, its setup and what PiCode saw (how long it lived, turns, how often it asked for you), with filters, a later answer, record deletion and a JSON-lines export. Records stay on this machine; environment variables are kept by name only.
  • Agent outcomes on the dashboard: removed agents, the share resolved and the reason most in the way for the chosen range.
  • Hermes's Add provider lists every provider Hermes supports (about 45, read from Hermes itself). You can add a key, or sign in with a code for Nous, OpenAI Codex, xAI and MiniMax, without a terminal. Hermes keeps each credential in its own pool, after the ones already there.
  • The integration declaration names its mode. mode is local (PiCode runs the declared commands and the fast-forward), provider (the project's own merge queue integrates it; PiCode enqueues and observes), or absent, which runs nothing. It is set in Preferences → Landing work or in a workspace's Settings, beside the rules it applies to, and follows the same workspace → machine fallback.
  • Provider mode carries no check commands — its provider runs those — and the declaration refuses the combination instead of keeping commands that would never run.
  • Grok's Add provider opens its own sign-in: your Grok account in the browser, a device code for signing in from a phone or another computer, or an xAI API key. No terminal is needed, though signing in from one is still offered.
  • Landing work on the phone. Preferences → Landing work now exists in the mobile app too: this machine's rules for landing delivered work, the workspaces that follow them, and an Edit sheet per workspace to rename it or give it rules of its own.
  • Codex's Add provider opens its own sign-in, the same options as Codex's /login: ChatGPT in the browser, a device code (for signing in from a phone or another computer), your own API key, or Amazon Bedrock. Codex saves each login itself. Signing in from a terminal is still offered.
  • Claude Code can run through an Anthropic-compatible gateway (Z.ai, Kimi, DeepSeek, MiniMax and others), set up from its sign-in dialog. You give the URL, the token and, optionally, the models. Your Anthropic key is never sent to the gateway.
  • Claude Code can run on Amazon Bedrock, Microsoft Foundry or Google Vertex AI, set up from its sign-in dialog ("3rd-party platform"), with the same sign-in methods Claude Code's own /login offers. The Providers pane shows which platform is in use, with Edit and Stop using.
  • Omp agents load Pi's Inbox reply receiver, so a reply arrives as the agent's own turn, confirmed against its session file, as it does for Pi.
  • Preferences → Landing work. Set this machine's rules for landing delivered work — the ones every workspace without its own follows — and see which rules each workspace uses, with an Edit shortcut to its Settings.
  • Claude Code's Add provider opens its own sign-in: your Claude subscription through the browser, or an Anthropic Console key. No terminal is needed, though signing in from one is still offered. Only one login is in use at a time, and Use switches between them.
  • Make agent. When you type a CLI such as Claude Code or Codex into a plain PiCode shell, the shell offers to make it an agent — named, in the sidebar and the fleet, with its own permissions. It only happens when you press the button.
  • Dashboard: Codex and live Claude Code sessions count in Spend. Turns a CLI leaves unpriced are estimated at list price from LiteLLM's public price table, refreshed daily; the estimate is marked on the Spend card, on each CLI row ("estimated" or "$X est.") and on each model row ("~$X"). A CLI's own figure always wins. Set PICODE_PRICE_TABLE_URL=off to keep PiCode from fetching the table.
  • Checks for Omp. Omp's Settings pane opens with a card of measured problems for the folder: a config file Omp moved aside, a key written twice or in the flat form, a key this Omp no longer knows, the older .omp/settings.json, Pi settings Omp does not read, a committed .env, no approval mode set, and how many Omp terminals will read a change only at restart. Each line has one action. Below it, every setting Omp resolves in the folder, with the file it comes from; credentials are hidden.
  • Tool approval (tools.approvalMode) is a row in Omp's Settings.
  • Workspace settings. A Settings… item on the workspace card's menu renames the workspace and sets how delivered work lands in the project: follow this machine's rules, or give the workspace its own (up to eight checks that must pass before an authorized branch lands as a fast-forward). With no rules, or fast-forward off, it says plainly that authorized branches stay blocked. It also links to the workspace's Communication page.
  • An authorized entry actually runs now. Authorizing a queue entry is execution authority: PiCode runs the operation the project declared — fast-forward only, after the declared commands pass — and records on the entry what it did, or the reason it did not. A second entry in the same repository waits: one operation per repository, enforced in the store and in the daemon.
  • Every stale authorization is a named blocker, never a silent move: no declaration, a declaration that is not fast-forward-only, the branch moved off the reviewed revision, the target gone or moved past a fast-forward, or recorded evidence of failed checks. The target stays where it was.
  • A daemon that stops mid-run leaves the outcome unknown on the entry — nothing is retried and no success is inferred — and the owner's withdraw clears it.
  • Dashboard: the Limits card shows every plan PiCode can read. Plan windows fetched for signed-in accounts (Anthropic, xAI, Z.ai, Codex and the rest) now sit beside the ones a CLI records itself, and a plan that needs a new sign-in says so, with a link to the right Providers pane.
  • Backups cover every agent CLI. A snapshot now keeps each CLI's settings file; with Include secrets, its login file; and with Include sessions, the conversations of Claude Code, Codex, Grok, Omp and Muse Code as well as Pi's. Restore puts them back. OpenCode, Hermes Agent and Antigravity keep conversations in a live database, which is not copied.
  • Agent CLIs: /login opens where you are looking. A CLI's "open in the browser" (OAuth logins) no longer starts a Chromium inside WSL: the page opens in the desktop app's own browser tab, in a tab of the browser you run PiCode in, or — with no client open — in the Windows default browser. CLI launch PATHs carry the PiCode wrappers too, so CLIs that resolve xdg-open/wslview by PATH (not $BROWSER) are covered. Off switch on Agent CLIs ("browser hand-off").
  • Omp Models pane. #/clis/omp/models lists every model Omp reports it can reach in the workspace, grouped by provider, with kind chips, a filter, context size and price. Allowed edits enabledModels (Omp then uses only those, and the pane warns when none of them is reachable in the folder); Hide provider / Show edit disabledProviders. Both layers; a toggle writes the layer's complete list, because omp's arrays replace the parent's rather than extend it.
  • The pane says when a layer leaves Omp with no usable model (an allowed list naming only models the folder cannot reach) and offers Allow every model here; a layer that hides every provider says so and offers Show all.
  • The model catalog answer is kept while the config files it depends on are unchanged, so reopening the pane is instant; Refresh asks Omp again.
  • Omp terminals now show their todo plan as the sidebar checklist — the current step on the agent card, the full list in the disclosure — the way Pi and Claude Code already do. The new packages/omp-checklist is an installable omp package: it watches omp's native todo tool and mirrors the committed phases to the checklist routes at whatever scope you install it — Global, This workspace, or an agent's package list. Omp registers no new tool and nothing is gated.
  • Workspace menu: ways out of PiCode. The "…" menu on a workspace card now shows the folder in Explorer (or the file manager), copies its path (Linux and Windows paths under WSL), opens the repository on GitHub, GitLab, Bitbucket or Azure DevOps, and opens or creates the pull request for the current branch.
Melhorias · 20
  • Removing a workspace, or an agent's terminal, now keeps a record of each agent it ends.
  • Model pickers, Providers and the agent status bar no longer wait about two seconds on every catalog read: the llama.cpp server's answer is kept and refreshed in the background (an unreachable server no longer stalls anything), and Pi's model list is kept until a sign-in, a custom provider, a package or Pi itself changes. Try again on Providers asks Pi afresh.
  • A declaration that names no mode no longer executes. An entry the owner authorizes is ejected with not run: the project declares no integration mode…, and the Delivery read and the settings surface both say so; adding mode to the declaration restores it.
  • Under provider, ordering is refused (the provider owns the queue's order) rather than being a second opinion beside the provider's queue.
  • The desktop app shows your workspaces, agents and terminals as soon as they are read (tens of milliseconds), instead of first waiting several seconds for the Pi model catalog.
  • The workspace card's ⋯ menu no longer offers Sessions — open sessions from Agent CLIs, the dashboard's top-sessions tiles, or an agent instead. The menu now holds Communication, Files, Git graph and the outside/Settings actions.
  • Management errors now say what happened and what to do, such as "PiCode inside the distro is older than the desktop app. Update PiCode, then scan again." The tool's original message stays underneath in smaller text.
  • The Management window now shows its scan as it happens. Windows and the distro each get a row with a spinner and a clock, and each card fills as soon as its half is read. Scan again keeps the previous numbers on screen until the new ones arrive.
  • The Clean tab uses the same scan as the Disk tab, so opening the window walks the home directory once instead of twice.
  • Omp's model rows: the model picker's arrow sits at its right edge like the selects beside it, a role's help line keeps clear of the controls, and Settings rows without a help line no longer touch.
  • A CLI that was still running in a terminal with no agent becomes an agent on upgrade, keeping its browser and computer permissions. Permissions now belong only to agents: a CLI typed into a plain shell gets no grant (the computer tool refuses it; the browser keeps only its own split beside the session) and cannot register deliveries until you make it an agent. Settings ▸ Browser and Settings ▸ Computer list agents only.
  • A CLI's sign-in terminal no longer shows up in the sidebar or among the CLI's terminals; it lives on the Providers card that opened it. PiCode closes it once the account is saved, when the login exits, after 15 minutes without activity, or when you press Cancel — and the card says when it closed.
  • Every CLI you start from PiCode is now an agent. Agent CLIs' New terminal is New agent (launch profiles included), a session's Open in terminal is Resume as agent, and continuing a conversation in another CLI opens it as an agent — so it shows up in the sidebar and the fleet, and permissions, Inbox and automations reach it by name.
  • On the phone, the Settings, Packages and Providers shortcuts in More's search open the CLI of the last agent you opened (Pi when there is none), their labels no longer say Pi, and the matches share one "Agent CLIs" group (the heading used to repeat over each row, on the phone and in the desktop menu search).
  • Omp's model roles moved to the Models pane. Roles, the quick-switch cycle, fallback chains and the retry settings now sit above All models on #/clis/omp/models, the way Omp's own model hub keeps them on one screen. A role whose model is not reachable in the folder, or not in the allowed list, says so on its own row. Settings keeps the thinking level, memory and interface rows.
  • A fallback chain reads as what it is for — "When default fails", "When any openai model fails" — and the Fallbacks help says what @smol means.
  • Omp's Add provider now opens the same dialog as Pi: search the providers, choose between an account and a key, finish the sign-in in the browser (or in Omp's own login when PiCode cannot run it), and reach Custom provider from the list. Only what Omp supports for each provider is offered.
  • The workspace menu's Communication row has its own two-bubble icon instead of repeating the Sessions list icon.
  • Omp's Providers pane offers every provider Omp's own /login lists (about 80, read from the installed Omp), not only the 11 PiCode declared. A key saved for one of them is passed to Omp in the variable Omp reads it from.
  • The workspace menu is grouped: PiCode views first, then the new outside actions, then Move up / Move down, with Remove workspace last.
Removido · 1
  • POST /api/clis/{cli}/terminals. Starting a CLI goes through POST /api/agents or POST /api/workspaces/{id}/agents with overrides.
Correções · 47
  • Keys already in Hermes's credential pool are recognised again. Hermes 0.21 stores them under a different field.
  • The architecture reference matches the code again after the first prose-audit wave (routes, agent-manager, terminal-bridge, security-model): five path references that still pointed at web/desktop/src/lib and web/desktop/src/styles now name the browser bundle where that code lives, the user-menu description names the real groups (Tools: Automations, Snippets, llama.cpp; PiCode: Preferences, Browser, Computer, Devices, System, Integrations, Termset), and the workspace-menu and per-CLI session-index descriptions reflect the current nine-CLI, no-Sessions-item reality.
  • A terminal whose shell is gone no longer survives as an empty row. tmux reports a session as alive for the few milliseconds before it reaps a pane that died at once, so PiCode could keep a terminal that never lived — and every later action on it answered "no server running". The creation now asks a second time, 50 ms later, before it trusts the answer.
  • The desktop app's windows keep working when PiCode runs on a port other than 8445, whether another port in its range or one you picked in Settings. Before, the Management window opened but could not scan, and the main window's buttons stopped responding.
  • An xAI key saved for Grok now reaches Grok. Choosing it signs Grok out of its own session, which is kept in the vault, and Use brings that session back.
  • The Apps sidebar no longer flashes "No apps yet." while your apps are still loading.
  • Opening Management from the tray no longer freezes the tray while WSL is slow. The window opens right away at the address PiCode is already answering on.
  • The desktop app no longer waits a full 30 seconds before showing its main window at startup or after Open PiCode rebuilds it. The check that waits for PiCode to be ready was probing the distro's name instead of PiCode's address, so it could never succeed.
  • When Give back held space fails before anything stops, the Management window no longer says the distro was restarted. When it fails after the stop, the window now says that the distro's sessions ended.
  • The Connectors docs no longer teach a removed import flow. The app adds connectors from the Marketplace catalog cards or the Custom server… form; the MCP guides, the Integrations guide and connectors/README.md now describe that flow. The sidebar tab list in Getting started includes Apps, and the connector packages' install paths name their real location (Agent CLIs → Connectors → Installed).
  • Opening the desktop Management window no longer pops up a terminal window: every measurement and cleanup now runs in the background.
  • The steps of Give back held space now show in the window while it runs. Before, the window never received them.
  • Moving Codex from Amazon Bedrock to another login no longer leaves it pointed at Bedrock.
  • In dark mode, primary buttons, the send button and pressed Canvas tools are easier to read: their fill is a deeper blue, and white text on it now meets the WCAG AA contrast bar (5.3:1, up from 3.0:1).
  • While the app is still loading, the sidebar and the main pane no longer claim you have nothing ("No workspaces yet.", "No agents yet / Add workspace"); they show a placeholder until your work has been read.
  • Ignore in the Inbox closes a question from an agent running in its terminal. It used to fail with "The terminal session could not be identified safely" for Claude Code and every other non-Pi agent, which left the item impossible to close.
  • A shell could still become a CLI terminal with no agent through its launch settings; that is refused now — use Make agent.
  • A sign-in terminal closes when its login exits (it no longer drops back to a hidden shell), times out after 15 minutes without activity instead of 15 minutes after it opened, and Check now after coming back to the card no longer files the account that was already saved.
  • Esc and clicks inside the sign-in window go to the login instead of closing it; on phones the window has the terminal key bar.
  • New agent with a folder that does not exist says so instead of creating it; a Pi New agent from Agent CLIs is the same Pi agent the palette makes.
  • Upgrading no longer fails to start when a terminal belongs to a workspace that is gone, a Pi terminal keeps its conversation as an agent, and deliveries a terminal registered stay reachable by its agent.
  • A stopped agent terminal offers Start instead of sending you to Agent CLIs.
  • A browser sign-in (Anthropic, OpenAI Codex) left unfinished no longer blocks every later sign-in with "already in progress" until PiCode restarts: it gives up after 15 minutes, like the device-code sign-ins.
  • Replying in the Inbox to a question from Claude Code, Codex, Grok or any other non-Pi agent no longer fails with "The terminal session could not be identified safely". An agent still waiting in ask_human gets the answer as the tool's result. If it stopped waiting, the reply is typed into its terminal. If it is not running, the answer stays on the item, and the item says the agent was not told.
  • The mobile Inbox's Reply now reaches a Pi agent running in its terminal, as the desktop Inbox already did.
  • An Anthropic key saved for Claude Code now reaches Claude Code: new terminals start on it once you choose it. Before, the key was saved and never used.
  • Creating a terminal right after closing the last one no longer fails. When tmux's server had just emptied — the moment between the last session ending and the server exiting — its has-session answer, *"no current target"*, was read as a real failure, so PiCode refused to create a session it should simply have created. The answer now means what it is: not there.
  • Removing a workspace no longer leaves its integration rules behind.
  • Two windows saving a workspace's integration rules over each other now get a conflict instead of silently losing one save.
  • On a narrow window, pressing Escape in a dialog opened from the sidebar no longer also closes the navigation drawer.
  • Add provider's search now highlights the best match, not Custom provider. Typing and clearing keep the list at the top with the highlighted row in view. Custom provider is now a button under the list.
  • Provider icons: more of Omp's providers show their vendor's mark, and a provider with no mark shows the first letter of its name, not of its id.
  • Dashboard rankings no longer lose their bars in a narrow card.
  • The packages pane on every agent CLI now names the context you are bound to in its scope switch — Global, <workspace>, <agent> — the way Pi's always did, instead of a generic "This workspace" that could be any of them. A pane bound to no workspace stops offering the workspace scope rather than promising a scope that cannot install.
  • A list row's Use inherited sat alone at the right edge, in Settings as in Models; it now sits under the list.
  • Shared-server members can install CLIs from Agent CLIs. Their container now has Node.js 22 and installs into each member's own ~/.local; before, the distro's old Node and a root-owned npm made Install fail. Existing containers are updated on the next picode provision.
  • Dashboard: Claude Code, Codex and Grok tokens are counted once. Claude Code repeats a response's usage on every block it writes, Codex forks copy their parent's history, and Codex and Grok count cached tokens inside input; the dashboard summed all of it and showed roughly twice the real token totals for Claude Code and Codex.
  • Dashboard: Claude Code subagents are counted. Their transcripts live one folder deeper than the dashboard looked, so their tokens and tool calls were missing.
  • Dashboard: Grok usage comes from its update stream. Sessions that never wrote usage.json now report tokens and cost.
  • Automations and the Chrome extension no longer paste into a CLI's login or menu screen. When the terminal of a Claude Code, Codex or other agent is open but not at a prompt PiCode recognizes, the run is skipped as unrecognized and nothing is typed; before, it was pasted blind and recorded as done.
  • The Chrome extension sends to agents of every CLI. A non-Pi agent gets the page link and your message at its prompt while its terminal is open; screenshots and Act on this page still need a Pi agent.
  • Provider usage works without Pi. The usage summary and its background refresh read the signed-in accounts from the vault instead of Pi's model list, so the Providers roster of every CLI keeps its usage on a machine without Pi.
  • PiCode no longer checks Pi packages against npm every 30 minutes on a machine where Pi was never used.
  • System's Agent CLIs section no longer flashes "none installed" while the list loads: it shows placeholder rows, and says so if the list cannot be read. On the phone, the list now refreshes after you install or remove a CLI, so System and the Automations banner stay current without a reload.
  • The Automations "Pi is not installed" banner ignores disabled automations.
  • A free New agent takes the CLI's name when the Name field is left empty, as the placeholder suggests.
  • The docs say what PiCode needs precisely: only tmux for PiCode itself, Node.js and npm to install CLIs from Agent CLIs, Install for Pi, Claude Code, Codex, OpenCode and Omp, and how Connectors differ on the CLIs other than Pi.

0.5.0

22 novos · 28 melhorias · 23 correções

Novo

  • The integration queue exists at its doors. A project can declare how it integrates — fast-forward only, plus up to eight single-line commands, per workspace with the machine as the fallback layer — and the Delivery read answers with both the queue and the resolved declaration.
  • An agent can ask for a place, and take it back. picode delivery request-integration names the revision and target the delivery declares (the daemon refuses a drifted revision), withdraw-integration steps out by the entry's own id and version, and show prints the entry. The same actions are in the MCP tool and in packages/pi-delivery; the owner orders and authorizes entries through the queue's owner-scoped API, and the store refuses order/authorize for anyone else.
  • Nothing runs on its own yet: the serialized executor and the queue's own view are still to come, and deployment execution remains unavailable.
  • Omp model roles in Settings. #/clis/omp/settings now edits Omp's own role map: one row per role the CLI has (DEFAULT, SMOL, SLOW, VISION, PLAN, COMMIT, TINY, MEMORY, TASK, ADVISOR and the five kind roles), plus any role you invented, each with a model picker fed by Omp itself and a thinking-level select. Fallbacks edits retry.fallbackChains as ordered lists, and Quick-switch cycle edits cycleOrder — the list Omp's own hub draws as ⟳ N beside a role. Both layers, including the workspace file omp config set cannot reach. New rows for modelRoleStorage, defaultThinkingLevel and Omp's eight retry knobs.
  • GET /api/cli-models?cli=&workspace= asks a CLI which models it can reach, in the workspace being edited. Omp only; it runs when a picker opens.
  • Omp terminals now show their todo plan as the sidebar checklist — the current step on the agent card, the full list in the disclosure — the way Pi and Claude Code already do. A checklist-mirror extension rides the same wrapper injection as omp's terminal-state extension and POSTs the native todo tool's committed phases to the terminal's checklist routes; omp registers no new tool and nothing is gated.
  • Omp agents can carry their own packages. The This agent install target used to be Pi's alone. It now works for an Omp agent too: those entries are PiCode's own list on that agent, and Omp receives them at its next start (-e). "Only this agent's packages" is offered for Pi and Omp — the two CLIs whose launch can be handed a per-agent list.
  • One architecture file for packages. docs/architecture/packages.md describes the engine, the report the pane renders, the agent layer and the measured vendor facts; the older split description is gone, and the architecture index, the routes reference and the public guides point at it.
  • Development flow: "When the flow bends". The guide now walks the thirteen situations where a step refuses — CI red after the fast-forward, a land that cannot fast-forward, a dirty root checkout, a deploy mid-turn, a handoff topic the board cannot see, a board over its target, an abandoned session (stalled:), a clobbered living doc, a note refused on main, a make vale vocabulary hit, a dead docs link, a worktree-gc keep, and a debt outliving its note. Each card quotes the message the command actually prints and names the action that unblocks it: a refusal describes state, it is not a wall to route around.
  • Development flow: escape hatches. A table of the five deliberate overrides — PICODE_ALLOW_SWITCH, PICODE_ALLOW_MAIN_REWIND, picode deploy --force / PICODE_DEPLOY_FORCE=1, FORCE=1 and --no-verify — with the guard each one disables and the use it is legitimate for. The mutation lock is not on the list.
  • Providers: Guided sign-in in the Add provider dialog now covers omp's OAuth providers (Anthropic, OpenAI/Codex, GitHub Copilot, Kimi, xAI) — one click opens the provider's authorize page in a browser tab, the callback returns to PiCode, and the subscription is stored in the vault and injected into Omp's terminal through its declared env names. No terminal detour for these providers; the strip remains for the rest.
  • Omp agents can carry their own extensions. The packages pane's "This agent" scope used to be Pi's alone; it now works for an Omp agent too. An entry added there is PiCode's own list on that agent, and the agent's next start passes it to Omp as -e — so the extension loads only for that agent, and "only this agent's packages" switches off what Omp would otherwise auto-load. Nothing is written into Omp's own configuration.
  • Development flow: a new guide page, "Development flow", maps the loop every PiCode change follows — elaboration, isolated worktree iteration, closing docs, owner landing, owner deploy, post-deploy cleanup — with a diagram, the rules that enforce the order, and the guardrails that keep the shared tree alive.
  • Omp's own extensions are listed in the packages pane. Omp loads these from its own settings rather than from its plugin store, so the pane showed the vendor's plugins and nothing else. Each configured entry now has its row — the CLI's own name for it, the path it resolves to, the layer that declared it ("Global" or "This workspace") and whether it is switched off — and removing one takes it out of the layer that named it: PiCode edits the workspace's .omp/settings.json (every other key left exactly as it was), and the user layer goes through Omp's own omp config set extensions.
  • OpenCode's keyboard map is editable in PiCode. Agent CLIs → OpenCode → Keyboard lists the 162 actions OpenCode's own config table declares (with its descriptions) and writes keybinds rows into the CLI's user ~/.config/opencode/tui.json — never the legacy keybinds section in opencode.json, which the CLI itself migrates away. Disabling an action is written the CLI's own way ("none"), and the tab says a change needs a TUI restart, which the loader's source confirms.
  • Antigravity's keyboard map is editable in PiCode. Agent CLIs → Antigravity → Keyboard lists its 36 actions with the chords the installed build ships, and PiCode writes the CLI's own keybindings.json — the vendor's override file, where removing a row hands that action back to the built-in binding. The tab says a change needs a restart, which is what a live session showed.
  • Codex's keyboard map is editable in PiCode. Agent CLIs → Codex → Keyboard lists its 149 keymap keys in the twelve contexts Codex puts them in — global, chat, composer, editor, the four vim modes, pager, list, agents and approval — with the description each key carries in Codex's own schema and the chords it binds out of the box. PiCode writes [tui.keymap.<context>] tables in ~/.codex/config.toml and leaves every key it does not manage exactly as it was, including everything the Settings tab edits. Chords are shown and written in Codex's own spelling (ctrl-alt-m, page-down); a chord Codex cannot express is refused by name rather than written, because Codex validates its keymap when it starts and will not start on one it cannot parse.
  • Providers: a guest CLI's Add provider dialog now offers Guided sign-in for providers the CLI signs into — one click closes the dialog and starts the CLI's own login in a terminal (the vendor's OAuth happens there, never in PiCode); the sign-in strip with Open terminal / Check now takes over from there.
  • Delivery in the PiCode tools switch. An agent whose CLI is Claude Code, Codex or OpenCode can be given the delivery tool in its launch settings, so it registers a change and asks for review in the project's Git ▸ Delivery view without hand-written client configuration. The tool family existed, but the form offered only Computer, Browser, Inbox and Checklist, so it could not be switched on for an agent whose launch settings had been customized.
  • packages/pi-delivery for an agent whose CLI is Pi: the same register, update, request-review, withdraw-review, show and list as a tool instead of a command, with the retry key derived from the session, the action and the payload so a repeated call replays the same declaration.
  • Omp's keyboard map is editable in PiCode. Agent CLIs → Omp → Keyboard lists its 70 actions with the descriptions Omp itself gives them, and lets you add, replace or hand back a binding. PiCode writes Omp's own file — its keybindings.yml, or the .yaml or legacy .json file it is already using — and leaves every row it does not know about exactly as it was. A row the file holds in a shape PiCode will not rewrite is reported and never touched, a file that changed since the pane read it is refused instead of overwritten, and the tab says when Omp picks a change up (restart it).
  • Providers: Omp now has the same custom-provider surface as Pi — Custom provider on Omp's pane adds a gateway (base URL, API type, models) by merging into Omp's own ~/.omp/agent/models.yml, leaving hand-edited providers, unknown fields and comments untouched. Omp's API key lives inside the definition (the only place a custom Omp provider can carry one); it is never shown back, only spent on the gateway — Verify and Load models read it from the file. The form offers Omp's accepted options only, and definitions appear as rows on the pane with Edit / Verify / Remove.
Melhorias · 28
  • The System page lists tmux as the only requirement (mkcert and tailscale stay optional) and gains an Agent CLIs section with one row per CLI linking to its page; the pi row and the "install pi with npm" warning are gone.
  • Automations report "Pi is not installed" only when a run actually needs Pi — a start, or a message to a Pi agent. A message to another CLI's agent does not need Pi.
  • Providers: the table lists only providers you have an account, a custom definition or a login to import for; the rest stay in Add provider's list instead of filling the pane with "No accounts yet" lines.
  • Settings, Packages, Providers and Connectors follow the selected agent's CLI. Opened from the user menu or the Ctrl+K palette, they now show the CLI of the agent you are on instead of always Pi; the palette row is now "CLI settings".
  • The configuration docs (Configure, Settings, Providers, MCP, Integrations) cover all nine agent CLIs and name Pi only where a feature is Pi's; the Backup page states that only Pi's files are copied.
  • Labels stop saying "pi" where they mean any CLI (the Browser and Computer identity notes; the connector error action is now "Open Agent CLIs") and say "Pi" where they mean it (start automations create a Pi agent).
  • A settings row may now be a model selector at a vendor-supplied path, or an ordered list of strings. Everything else is unchanged: a key nobody declares is never written, a document that does not parse is never overwritten, and comments and unknown keys survive a save.
  • New agent picks its CLI. The sidebar's New agent — on the Agents tab, the create action on the Browser and Computer pages, and the mobile Agents section — opens the same CLI picker a workspace uses: Pi, Claude Code, Codex, Grok, Hermes Agent, OpenCode, Muse Code, Antigravity or Omp, with a Name and an optional Folder. A guest CLI agent gets its own terminal on that folder; POST /api/agents accepts cli.
  • The picker lists Pi only when it is installed, like every other CLI.
  • picode provision no longer blocks on pi. The doctor reports which agent CLIs it found on PATH and converges with none of them installed. The member container on a shared server no longer installs pi; it keeps node and npm so members install the CLIs they use from Agent CLIs.
  • PiCode Desktop (Windows) installs tmux, git, curl, Node.js 22 and npm — no agent CLI. A machine without pi now finishes the install, --user aims only the picode binary, and a Node.js already present is left alone.
  • PiCode is an ADE for coding-agent CLIs, not a Pi UI. The README, the docs landing page, llms.txt and the operating contract now describe an Agent Development Environment for Pi, Claude Code, Codex, Grok, Hermes Agent, OpenCode, Muse Code, Antigravity and Omp; no CLI is required to install PiCode, and tmux is the only runtime dependency.
  • Getting started installs tmux and PiCode first. The agent CLIs come afterwards, from Agent CLIs or with the vendor's command; the from-source, remote-server and shared-server guides no longer ask for pi on PATH before the install.
  • The picode --help banner and the systemd unit's Description= now say "browser ADE for coding-agent CLIs".
  • One packages pane for every CLI. Which pane opened used to depend on the CLI's name: Pi got the rich one, the other eight a simpler one. There is one pane now — it asks the CLI's own engine what that CLI can do and draws exactly that, so each control appears only where the CLI has the mechanism behind it and a verb the CLI lacks reads as one line in the CLI's own words. Pi's controls, wording, transcript and gallery are unchanged.
  • A CLI's marketplace and updates, in the same pane. Where a CLI has its own update command, opening the pane compares its installed list with the CLI's own catalog, and Update appears only on the rows that catalog says are behind; a catalog PiCode cannot read leaves every row unmarked with the reason. Where the CLI manages marketplace sources, the Marketplace tab lists them with Add source beside per-source Update and Remove.
  • The development-flow diagram's phase-1 ADR diamond draws its no leg now: a UI refinement or a route move needs no record, while behavior changes still land in docs/architecture/.
  • One packages pane, every CLI. Which pane opened used to depend on the CLI's name: Pi got the rich one, the other eight a simpler one. Now a single pane asks the CLI's own engine what it can do and draws that — the gallery where the CLI's catalog is PiCode's, the vendor's roster elsewhere, and each control (install, remove, toggle, update, inspect, the config editor, the agent's "only this agent's packages" switch) only where the CLI has the mechanism behind it. The scope radios appear when the layer is one the read can honour, and the copy each surface spoke before is kept word for word ("Install to" for the gallery, "Plugins go to" for a vendor). Links that pointed at either old pane keep working.
  • Agent CLIs: the user-level scope is now called "Global" (was "This machine") across packages, native settings, memory, connectors and pi's own panes — the chip, the installed-row tags, the fallback buttons and the 400 message that named the old layer. Scopes now read Global / This workspace / This agent. Machine-scoped prose that is not a scope label (pairing's "This machine is trusted", the server bind "This machine only") is unchanged.
  • The Keyboard tab of an agent CLI whose map PiCode writes now says when that CLI reads a change, in the CLI's own terms: Codex applies one when it starts, and only its own in-session editor is live.
  • Providers: every CLI's bar button is now called Add provider (guests' dialog included) — the same word for the same door on all nine CLIs, and the guest dialog is titled to match.
  • picode help and picode mcp list PiCode's tool families from the catalog; the help line named only computer and browser.
  • Providers: when a second sign-in would replace an unnamed login, the pane offers two doors — Name and add (type a name for the new login) or Keep both (the login already saved is named from what PiCode knows and the new one gets its own row). Nothing is replaced without the person choosing.
  • The Keyboard tab of every agent CLI says what its map is: Pi and Omp are editable there; Hermes Agent points at the three keys its Settings tab carries; Grok and Muse Code link their own key list; and Claude Code, Codex, OpenCode and Antigravity say their editor has not shipped yet.
  • Desktop app: every link that leaves the app — Documentation, Full changelog, setup guides, "How it works", help links — now opens in a PiCode browser tab instead of the system browser. In a plain browser, links keep going to the system browser, where remote pages belong.
  • The Keyboard tab of every agent CLI in Agent CLIs now answers for that CLI: Pi keeps its map editor, and the others state what their map actually is and what to do next — the vendor's key list for Grok and Muse Code, which refuse remapping; the documentation for Codex, Claude Code, OpenCode and Antigravity, whose editors have not shipped; and Hermes Agent, whose three rebindable keys are now rows in its Settings tab (a Keyboard group: push-to-talk key, copy shortcut, and what happens to what you type while it works) with the Keyboard tab pointing at them. The "in development — coming soon" placeholder is gone: it promised a feature instead of describing the CLI.
  • Providers: the custom-provider form's URL hints and help lines no longer name Pi specifically; each CLI's Advanced section carries only what that CLI reads (Pi keeps the full set).
  • User menu: Documentation opens in a PiCode browser tab instead of the system browser (desktop shell). In a plain browser it keeps going to the system browser, where remote pages live.
Removido · 2
  • The /api/cli-packages* API family is gone. Every CLI's package verbs — its catalog and its configured sources, install, remove, update, toggle, marketplace and inspect — are on /api/packages*, with the CLI named in the request (cli), and the answers are the unified report every pane already reads.
  • The Pi update card on the System page and POST /api/system/pi-update; Pi updates from Agent CLIs like every other CLI.
Correções · 23
  • PiCode Desktop (Windows): installing a CLI from Agent CLIs works after setup. When the distro's npm installs into a root-owned /usr prefix, setup now points your account's npm prefix at ~/.local, so Install for Pi, Claude Code, Codex, OpenCode or Omp runs without root. An nvm setup is left alone.
  • Setup upgrades a Node.js older than 22 through NodeSource again (Pi needs 22.19 or newer), and names the replacement in the confirmation on a distro PiCode did not create.
  • The packages pane groups a CLI's plugins by the vendor's own provenance again (From a marketplace, Ships with the CLI, Local plugin files, …): a row carries that fact as kind, and the pane was reading the old alias's name for it.
  • Automations reach agents of other CLIs. A scheduled or webhook message to a Claude Code, Codex, Omp or other non-Pi agent is now pasted into that agent's terminal while it is open; before, it was always skipped as "agent in terminal" or "closed". A closed terminal now skips as terminal closed, with the reason in the Inbox.
  • Settings, Packages, Providers and Connectors open the right CLI from the user menu and the Ctrl+K palette when the selected tab is a non-Pi agent's terminal; they fell back to Pi.
  • Undo after removing a free agent recreates it with its CLI, provider and model instead of as a Pi agent.
  • OpenCode: removing a plugin works from the packages pane. Every removal used to be reserved for the CLI's job lane, which runs a command OpenCode does not have, so the pane answered *"this CLI does not expose that operation: opencode remove"* under a live Remove button. The transport declaration is one fact per verb now: OpenCode's install stays its own plugin command while its removal is PiCode's own write of the config file that names the plugin (comments and every other byte preserved), answered with the CLI's fresh list and shown as the same removal transcript Pi's own mutations show. A plugin the CLI's own config does not name is still refused, by name.
  • Guest CLI settings never saved from a browser. The pane handed a raw object to fetch, so every save since 2026-09-20 answered "invalid request body" (found by driving a real write on a scratch instance). The body is JSON-encoded now, for every guest CLI's Settings pane.
  • A settings value carrying a line break is refused by name instead of being written as a YAML block the next save would duplicate.
  • Writing a three-level YAML key whose middle map was missing appended a second top-level block instead of joining the existing one.
  • Omp: Enable/Disable on one of the CLI's own extension rows now writes the setting Omp actually reads (disabledExtensions) instead of running omp plugin disable, which does not know a configured extension. A workspace entry is edited in .omp/settings.json; a user-level one goes through omp config set.
  • A keyboard row on a phone keeps its label and its keycaps on one line with the note under them, instead of squeezing the keycaps into whatever the desktop grid left over — a CLI whose labels are long (Codex's are full sentences) had its chips drawn over the label. The narrow-window layout on the desktop app gets the same treatment.
  • On macOS, a running dev server answered "stopped" and every hidden row was forgotten. PiCode decided whether a process was still alive by reading /proc, and treated a file it could not read as a process that had ended — correct on Linux, where /proc is always there, and wrong on macOS, where it never is. Stop reported success over a server that kept running, and the Servers panel's hidden list emptied itself on the next read. Liveness is now asked the portable way off Linux.
  • A preview of a project reached through a symlink served 404 for its own files. The containment check resolved the file but compared it against the folder as written, so a project under a linked path — every path on macOS, where /var is /private/var, and any linked mount or home elsewhere — looked like it was escaping itself. Both sides are resolved now; a symlink that really does leave the folder is still refused.
  • Muse Code's Connectors pane writes a file Muse accepts again. The driver wrote the MCP block under mcp_servers; Muse reads mcpServers, so a server PiCode added never started — and a file carrying both keys made Muse drop the block entirely. Measured against the installed CLI (muse mcp --help names mcpServers) after a vendor-session sweep found the mismatch.
  • PiCode's tools work for a Codex agent. Codex starts an MCP server with an empty environment, so a Codex agent's tool calls answered no identity — Delivery, Browser, Computer, Inbox and Checklist were all unreachable from one. The launch now writes the identity into each server's own config (mcp_servers.<name>.env.…); Claude Code and OpenCode inherit the launch environment and needed nothing.
  • PiCode · Delivery appears in the connector catalog, so an agent whose CLI takes tools from its own configuration can add the Delivery tool like the other four.
  • Providers: when a CLI renews its tokens by itself, PiCode harvests the renewal back into the saved row on the next look — Verify, Usage and the in-use match keep working without a re-import. Matched by the stable refresh token, never guessed; the CLI's own file is only ever read.
  • Agent CLIs: the section tabs (Launch, Terminals, …, Connectors) no longer grow a stray vertical scrollbar beside the last tab on Windows. The strip still scrolls sideways when a CLI carries all nine tabs.
  • A QA scratch instance started from inside a PiCode terminal no longer passes that session's agent identity to the terminals it opens, and keeps its sessions in its own tmux server.
  • Inspector: the Changes tab reads in the same typography as Files. Branch group headers no longer render in uppercase small caps, and file rows are no longer bolder and wider-tracked than the Files tree — a shared CSS class name with the Servers panel's section labels leaked that style into every Changes row.
  • Providers: adding a second login to a CLI whose file carries no account name now asks for the name before writing — the preview says what the import would replace, so the previous tokens are no longer gone by the time the question appears. The name the person types is what the row shows.
  • picode inbox notify diagnosed a missing flag as a missing daemon. Leaving out --title answered "PiCode is not running" and exited 1, because the command looked for the daemon before reading what you typed. It now validates first, the way picode inbox ask already did, and says which flag is missing with the usage exit code.
Segurança · 1
  • A page open in another tab can no longer submit pairing codes to your PiCode. The pairing form was the one door left outside the cross-site check, so another site could post guesses at it — it still needed a code off your screen, and five wrong ones lock it out, but there was no reason to leave the door swinging. Reading the pairing page is unchanged, and so is pairing itself: picode pair and any script still work, and a device arriving on an address PiCode has never seen can still pair, because the address check deliberately stays off this route.

0.4.0

100 novos · 72 melhorias · 154 correções

Novo

  • The key-map API is documented for every agent CLI: GET /api/cli-keys?cli= answers one shape — the map's file and catalog, the host's platform, when the CLI picks an edit up — and PUT writes it. Pi answers today; the other eight answer with their state (and a refusal that names why: *"Grok does not allow its keys to be remapped"* is not the same fact as *"PiCode cannot write Codex's key map yet"*). See it in the API reference.
  • Keyboard → Find by key: press a chord and the map narrows to the actions that answer to it — the fastest way to answer "what is Ctrl+T doing?".
  • Keyboard → Reset all: hands every key this pane changed back to pi's default in one write, and leaves keys PiCode does not know where they are.
  • A warning on the chords a browser keeps. Five of pi's own defaults (Ctrl+T, Ctrl+W, Ctrl+N, Ctrl+PgUp/PgDn) never reach the terminal inside PiCode; the rows that use them now say so instead of silently doing nothing in a browser tab.
  • app.thinking.save (Ctrl+S) is on the map: the pane listed 89 of pi's 90 actions.
  • Observe project deliveries in desktop and mobile Git views, with branch inclusion, recorded checks, agent associations, evidence details and explicit incomplete or stale states.
  • Record best-effort scoped-check, full-check and integration receipts; picode delivery show and MCP report the same observed integration and validation facts. Execution queues and deployment observation remain separate follow-ups.
  • Register revision-bound delivery declarations and request review with picode delivery or the optional MCP delivery tool. Both share launch identity, durable retry receipts and version checks; integration queues and deployment remain unavailable.
  • Pins, Backup and Dev servers have guides. Three shipped surfaces had no user documentation at all: Pins is announced in Getting started as a sidebar tab and was never explained, Backup had seven API routes and not one sentence, and the Inspector's Servers tab existed only in the changelog. Pins and reminders, Backup and restore and Dev servers now cover them, including the two things a backup user has to know before they need them: a snapshot carries the credential vault but never the key that opens it, and what a restore replaces.
  • Installed plugins group by where they came from. A list that mixes origins (Hermes' bundled plugins beside yours, Claude Code's claude.ai-managed ones beside the machine's) now carries a header per group — Installed by you, Ships with the CLI, From a marketplace, Managed by claude.ai — keyed on the vendor's own provenance word. A single-origin list gets no header.
  • The plugin filter says what matched. The run of text a filter matched is highlighted in the name and in the description, instead of the card merely surviving the filter.
  • A marketplace chip filters the catalog. Clicking a marketplace name — on a catalog card or in the sources row — narrows the list to that marketplace, and clicking it again clears the filter.
  • An empty plugin list points at the CLI's own catalog. Where the CLI can install and its catalog was read, the empty state offers up to three real entries with Install, instead of only a link to the Marketplace.
  • The toolbar rides along. The filter and the update check stay pinned while a catalog of hundreds of rows scrolls under them.
  • "Check for updates" for the other agent CLIs' plugins. PiCode compares what each CLI has installed with what that CLI's own catalog offers and marks the plugins that are behind (→ 0.3.0), which is where Update appears. Before the check the pane offers the check itself instead of an Update button on every row, and a CLI whose catalog cannot be read says so rather than reporting that everything is current. Codex, OpenCode and Antigravity keep no Update action: those CLIs have no update command of their own.
  • Desktop: Ctrl+R and F5 reload the page on screen. A work-browser or web-app tab reloads that site; everywhere else reloads PiCode. A terminal keeps Ctrl+R for reverse search.
  • Paste files copied in Explorer straight into an agent terminal. Screenshots already pasted as bytes, but Explorer file copies arrive as references the browser never exposes — the attach never opened. In the desktop app an empty paste now asks the Windows-native shell, which reads the clipboard files and stages them through the same drop door (4 files, 4 MB each). Real browsers are untouched.
  • Desktop/Web: removing an agent now offers Undo in the confirmation toast. Undo re-creates the agent in the same workspace with the same name, CLI and config, re-attaches its session history, and opens its tab again. The old id is gone for good (automations pointing at it stay broken), and sessions only come back if the dialog's "Also delete sessions" was not picked. Per-agent package selection is the one setting Undo cannot carry over.
  • Deploys and desktop restarts can no longer race. make deploy, make desktop-restart and a direct picode deploy serialize on one lock; a CLI deploy caught behind it says so and waits. The desktop swap refuses to kill the shell while the WSL keepalive is not alive (the state that loses every session to the distro's idle reclaim) and ends with a real daemon-health verdict.
  • A refusal that needs you comes with the command to run. When a CLI turns a plugin action down because only a person in a terminal can answer it — Grok asks you to trust the source, a marketplace can ask for a command to be confirmed — the pane now shows the CLI's own words *and* the exact command, with Copy command and "Run it in a terminal." It works for the actions that answer immediately and for a background install or removal that failed.
  • Right-click on the globe offers Open browser / Close browser split and Open in new tab, instead of the generic window menu.
  • picode inbox notify|ask — the Inbox door for any CLI, no MCP config needed. Any guest CLI (Claude Code, Codex, a plain script) can file an FYI into your Inbox with one command, or ask you a blocking question: picode inbox ask --question "…" --wait polls until you answer in the Inbox and prints your reply on stdout, hours if needed. Same daemon discovery as picode mcp (--url, PICODE_URL, or server.json), same items, same app.
  • Packages works for the other eight agent CLIs. Claude Code, Codex, Grok, Hermes Agent, OpenCode, Muse Code, Antigravity and Omp each get the Packages pane on their own CLI page, driven by the vendor's own plugin commands: installed list, install, remove, enable/disable, and the CLI's marketplace where it has one. Pi's pane is unchanged.
  • Each pane offers only what its CLI has. Where a CLI exposes no verb the pane says so in one line instead of showing a control that does nothing — Codex has no plugin enable/disable, OpenCode has no plugin marketplace, Antigravity has no plugin update.
  • Install and remove run as jobs. They keep running with the browser closed, refuse while that CLI has a live terminal (a plugin loads on the next start), and never replay after a PiCode restart. Antigravity, Muse Code and Omp got their plugin stores read here for the first time; OpenCode's plugin list is edited in its own config, with every other byte of the file kept.
  • Device toolbar ("Responsive width") in the work browser — the native half. The ⋮ menu gains the reference's "Show device toolbar" row; the strip above the page offers width presets (390/768/1024/1280), zoom −/+ and a reset. Picking a width narrows the page to a centered preset-width rect of the pane (WebView2 bounds arithmetic, no CDP — mobile UA/touch/DPR would be the emulation half and needs an ADR); zoom rides the controller's ZoomFactor, clamped to WebView2's 0.25–5.0. State is per tab in the shell and rides btab_meta, so the strip survives tab switches and route returns; hiding the toolbar resets the tab (width, zoom, full pane bounds). The bounds/reset/zoom-clamp math lives in pure desktop-shell/src/responsive.rs (host-tested) and the preset/label/zoom ladder in web/browser/src/lib/responsive.js; the on-screen resize/zoom behavior is pending the owner's live Windows acceptance.
  • Codex's Memory pane shows its version history. Codex keeps that folder under git, so the pane now says how many revisions it holds, when the last one was written, and whether any file has changed since — and each row's Modified date comes from the revision that actually changed the file instead of the filesystem's timestamp, which moves every time Codex rewrites a file with the same contents. Any memory store the CLI keeps under version control gets the same line.
  • Paste screenshots and files straight into an agent terminal. Ctrl+V / Ctrl+Shift+V with an image or file on the clipboard opens the attach bar with the files staged, delivered through the same drop door as Attach files… — no more copying paths by hand. Text pastes keep the terminal's native paste; plain shells answer that attach is for Agent CLI terminals.
  • Mobile: the Inspector. The desktop rail's review surface, re-shaped for the phone: on the agent screen, a header button (the desktop's inspector toggle) opens it as a drawer over the conversation — Changes (folder-grouped with sums, an All | This agent scope that follows what the session's tools touched, and worktree following), Files and PR — and Back returns to the agent. From the Work tab, a workspace's changes chip opens the same screen pushed full-width. Git actions keep the three doors: prepare in the terminal, run when idle, ask the agent.
  • The Memory pane is a table you can audit with. Beside every memory it now shows how many other memories cite it, its size, when it last changed, and the things worth acting on: a memory the index does not name, and a link that points at a file that is gone. Any column sorts, the kind chips filter with their counts, and the file the CLI loads every session stays pinned at the top. On a phone the same numbers ride under the title with a Sort control.
  • The index budget. Claude Code reads only the first 200 lines or 25 KB of MEMORY.md at the start of a session and drops the rest in silence. The pane now shows how close the index is to that limit, and names any row in it that points at a file that no longer exists.
  • Delete several memories at once, with a confirm that names what it breaks: how many links in other memories will point at nothing, and how many of them the index still names.
  • Use: run a CLI on a saved account. Each guest CLI's Providers pane can now put a saved login into that CLI's own login file — the same thing Use does for Pi — so Claude Code, Codex, Grok, Hermes, OpenCode, Muse or Antigravity runs on the account you pick. The account in use is marked on the row, and it is read back from the CLI's own file, so a login made in the CLI's TUI shows up here too.
  • One credential vault for every agent CLI. Claude Code, Codex, OpenCode, Grok, Hermes, Muse, Antigravity and Omp now have a Providers pane of their own: see which accounts the machine holds, import the login a CLI already has, add an API key, verify it, pause it or sign out — one account per provider or ten.
  • Automated coverage for the work-browser capture path. The decisions of capture_png/btab_preview (capture completed / failed / timed out / tab gone mid-capture) and the read-back gate now live in a pure module (desktop-shell/src/preview.rs) with host tests — a still is served only with non-empty pixels; a zero-byte capture ("the page has not painted") is refused. The legacy hide/restore decision of the options menu (coverDecision in previewStill.js) carries the same table tests. The COM capture and native hide themselves stay owner-verified on Windows.
  • Pi's Settings pane gained five of its own settings on the This machine layer: Theme, Hide thinking, Quiet startup, New folders (pi's trust default) and Shell. Pi persists about forty keys and the pane showed eight, so a machine with a theme set saw no theme row at all. Each name and its allowed values were read out of the installed pi build before being declared, and a key pi keeps for the machine is refused by name if it is sent to the workspace or agent layer.
  • The desktop Pi view now attaches interactive sessions through the canonical Agent CLIs terminal binding and exposes the Chat/Terminal switch in the agent toolbar.
  • Mobile agent views now keep Chat and Terminal on one agent route, with the view switch in the contextual toolbar and a durable terminal deep link.
  • Non-Pi agent rows now attach their mobile Terminal view to the bound Agent CLIs terminal surface, reusing the canonical terminal session path.
  • Settings for every agent CLI. Claude Code, Codex, Grok, Hermes Agent, OpenCode, Muse Code, Antigravity and Omp now have a real Settings pane at #/clis/<cli>/settings that edits the CLI's own config file — model, approvals, sandbox, reasoning effort, memory switches and more, each row named with the vendor's own key. A CLI with one config file shows one layer; one with a workspace file shows both, with the file it writes named under the switcher and provenance on every row.
  • A Memory pane for every agent CLI at #/clis/<cli>/memory, showing what the CLI has remembered between sessions. Claude Code, Hermes, Muse Code and Omp are read, edited and pruned from the browser wherever they keep plain markdown; Grok and Codex are read here and cleared with their own command, because they generate those files; Pi and OpenCode say in one line that they keep no memory, and Antigravity says PiCode cannot confirm one. Omp writes nothing until its memory backend is turned on, and PiCode reads its folder from two paths the vendor does not document, so that pane is usually empty.
  • Document the execution plan and acceptance gates for the remaining work-browser items.
  • Scope Omp agent /resume sessions to a durable private directory per workspace agent.
  • Require an explicit agent terminal destination before sending annotations from an independent browser tab.
  • Inspector Changes follows dirty worktrees. When the anchored folder is clean but a linked worktree of the same repository has uncommitted changes, the rail shows that checkout behind a Following pill (Back returns to the anchor); several dirty checkouts render one branch-headed group each. The branch chip, Git menu and commit dialog address the followed checkout, and its files open in the center through the same file tab. Works for agents, terminals and workspaces, with any CLI.
  • Windows setup finishes on a clean machine. picode-desktop install now delivers the Linux binary and the runtime itself: an install-picode stage (the release matching the tool, verified, placed where provisioning resolves it) and an install-runtime stage (tmux, git, curl, Node.js from the NodeSource repository, pi) between account creation and provisioning. Ubuntu only; anything already present is left alone; a distro PiCode did not register asks before apt and npm run (--yes skips the question); the install ends with the shell running in the tray.
  • Per-account installs. install --user <name> puts the picode binary in that account's ~/.local/bin and installs pi for it alone (its own npm prefix, linked where the login shell finds it). Without the flag pi stays a system-wide root install. An unknown account fails fast naming it.
  • Install failures stay visible. The launcher waits for the elevated run and reports its exit code instead of exiting 0; the last error line lands in %ProgramData%\PiCode Desktop\install.log; the elevated window pauses for Enter on failure rather than closing with the evidence.
  • The address bar now suggests the pages you have already visited — the ones you typed first — with ↑/↓ and Enter to open one. The pane that runs without the desktop app offers only the servers it can actually frame.
  • Sending annotations has no limit on how many: the whole set travels as one note (every pin's sentence, element, HTML, styles and screenshot) plus one crop per pin, and the crops that do not fit the paste are staged beside the note, which names every one of them.
  • docs/architecture/work-browser.md — the work browser's own architecture file (who decides what, the command channel, tabs, the "a layer never paints over a WebView2" rule, permissions, annotations, and the traps that are architectural rather than dated).
  • The annotation card now offers the element's own styles — text color, background, opacity, font, size and weight — and every change is a live preview on the page. What reaches the agent is the pair: what the page had and what you proposed, so a preview is never mistaken for the page.
  • Marketplace connector cards now have a Docs link to the server's website or repository (seed cards with a cookbook page go there). Cards without a URL hide the link.
  • find_webview: one resolver for "the webview of this tab", used by the preview, the annotate mode, the trash and the state pull.
  • A workspace can create an Agent CLI from its New menu (Claude, Codex, and the others that are installed). You no longer have to go through Agent CLIs first.
  • Binding a Claude Code, Codex or OpenCode principal turns on PiCode's tools for that terminal (computer, browser, Inbox, checklist). Other CLIs still pick them up from Connectors. Grants stay in Settings.
  • A managed CLI that reports needs you files one Inbox item with Open terminal (and a push, if you allow actions). Ordinary shells still only show the chip on the row.
  • A workspace can bind an Agent CLI terminal as a managed principal (term:<id>): the same identity Computer and Browser grants already use, without creating a Pi agent or opening a chat. Create with POST /api/workspaces/{id}/principals. Removing the binding leaves the terminal and the vendor's files alone.
  • Annotate mode mirrors the page: pressing Esc in the page turns the strip off too (the pull says "off"), and a page with no script yet (a navigation in flight) is told apart from an off page.
  • Inbox and Checklist for Claude Code, Codex and the other agent CLIs. picode mcp inbox gives them notify_human and ask_human — a question waits for your answer in the Inbox and returns it to the agent — and picode mcp checklist shows their plan as the current step on the terminal's card. Two more cards in Connectors and two more switches under PiCode tools in Launch settings.
  • The annotate harness doubles as the navigation check: after a real navigation the script is gone, and one re-injection arms the new document again and re-reports its (empty) state.
  • type can paste. mode: "paste" sends the text through the clipboard and one Ctrl+V, for long text or apps that garble synthetic keystrokes (Windows 11 Notepad when busy). The clipboard's text is put back afterwards.
  • Computer lab: Embed into PiCode (spike). Two lab-only buttons reparent a chosen window into PiCode's main window and put it back, so the owner can measure whether Windows apps could get a pane like the work browser. Nothing in the product uses it.
  • Apps: clear one web app's data. The tile menu gains Clear data — signs you out of that app and deletes what it stored inside PiCode, without touching other apps or the work browser. Removing a tile now clears its storage too.
  • Annotate mode matches the reference. The strip replaces the URL bar while annotating (exit, discard-all, undo, crops toggle, hints, Send N); notes accumulate as numbered pins, each edited in an anchored card (Cancel/Save) and collapsed to a chip (text, options, remove); Send ships the whole set as one context to the agent terminal.
  • Connectors tolerate vendor JSONC configs on read. Trailing commas and comments that OpenCode and friends hand-write into their JSON configs no longer break the Connectors pane; every save still lands strict JSON. A blocked config file shows one line naming it, with Open and Retry; other config layers keep listing.
  • Apps: multiple accounts of the same service. The tile menu gains Add another account — a second, independent copy of a web app you already have (its own logins, its own data). Trying to add an address that is already installed now offers the same choice instead of just refusing.
  • PiCode tools for Claude Code, Codex and the other agent CLIs. picode mcp computer and picode mcp browser serve the computer and browser tools over MCP with the same names, parameters and answers as the pi packages. Turn them on per launch in a CLI's Launch settings (Claude Code, Codex, OpenCode), or add the "PiCode · Computer" and "PiCode · Browser" cards from the Connectors pane at workspace or machine scope. The switches in Settings ▸ Computer and Settings ▸ Browser apply to the terminal the CLI runs in.
  • Apps: each web app keeps its own logins. Installed web apps now live in their own storage inside the desktop app — two accounts of the same service work side by side, and clearing the browser data no longer signs every app out. Apps installed before this change keep the old shared storage until you remove and add them again (they will ask to sign in once).
  • Connectors for Muse Code and Hermes Agent — all nine CLIs covered. The Connectors pane now manages Muse's ~/.config/muse/settings.json (mcp_servers block, streamable_http transport, per-server on/off; schema_version and mode preserved) and Hermes's ~/.hermes/config.yaml (mcp_servers block edited as a YAML node tree so comments, key order and ${VAR} placeholders survive; malformed files refuse without writing). Both CLIs keep a single config file, so "this folder" scope points at it instead of inventing one.
  • Apps: Refresh keeps a web app tile truthful. The tile menu gains Refresh — PiCode re-checks the site and updates its icon, colors and start page (your name for it and its address stay; if the site is down, nothing changes).
  • Computer use, visible. Each step an agent takes on the computer shows its capture in the chat as the last capture, the dashboard counts the steps and the time an agent spent acting on the desktop, and the public guide explains what the switch in Settings ▸ Computer means.
  • Computer use for agents. Install the pi-computer package and switch an agent (or a CLI in a PiCode terminal) on in Settings ▸ Computer: it can then see the screen, click, type, use the clipboard and open programs through the desktop app, with your own permissions. Every call, allowed or refused, is listed on that page. Off by default.
  • Connectors for OpenCode and Grok. The same Connectors pane now manages their native MCP configs: OpenCode's opencode.json (mcp block, command arrays, per-server on/off; XDG_CONFIG_HOME respected) and Grok's .grok/config.toml ([mcp_servers.*] tables edited with a surgical splice that keeps comments and ${VAR} placeholders byte-for-byte; Grok has no per-server switch, so rows show none).
  • Computer lab in the desktop app's tray: a page that drives the new computer actuator by hand — list displays and windows, take a screenshot of a monitor or a window, click and type where you point on the image, read a window's accessibility tree, use the clipboard, open a program. It is the acceptance surface for computer use before any agent is wired to it; nothing changes for agents yet.
  • Connectors for Omp and Antigravity. Manage their MCP servers from the same pane: Omp in ~/.omp/agent/mcp.json (and your workspace's .omp/mcp.json), Antigravity in ~/.gemini/config/mcp_config.json (and your workspace's .agents/mcp_config.json). Each CLI keeps its own settings, servers switch on and off per entry, and sign-in follows the vendor — the Omp TUI command, or Antigravity's Agent Settings.
  • Agent CLIs: additional folders control. Claude Code, Codex and Omp launch editors offer one-per-line extra workspace directories, written as repeatable --add-dir flags alongside the other quick controls.
  • Connectors (MCP) management for Claude Code and Codex: #/clis/claude-code|codex/connectors manages each CLI's native MCP config — Claude Code's workspace .mcp.json plus its vendor CLI for user scope, Codex's config.toml with comment-preserving surgical edits — behind the same pane and API shape as Pi, with honest "configured" status and per-CLI toggle capabilities.
  • Windows Hello and passkeys (Settings ▸ Browser ▸ Password manager): a row that opens Windows' own Sign-in options. PiCode does not store or unlock passwords and passkeys — Windows does — so the row points at the screen that manages them instead of imitating it. It appears only in the desktop app, and it is the first target class besides http(s) that the shell will hand to the operating system.
  • Dashboard covers Omp, Muse Code and Antigravity. "What each CLI reports" now has nine rows: Omp reports spend, tokens, turns, tools and agent time; Muse Code reports prompts, turns, tools and model (no tokens or cost in its logs); Antigravity reports step counts as turns from its conversation index.
  • Apps: install web apps as desktop shortcuts. The Apps tab gains +: type a web app address, PiCode checks it answers and reads its name and icon, and the tile opens the site inside the desktop app with its own tab and login. Rename or remove from the tile's menu; unread counts in the page title show on the tile. In a plain browser the tile explains it needs PiCode Desktop.
  • Agent CLIs: quick launch settings. The launch editor offers verified model, approvals, reasoning/thinking and sandbox controls above the advanced argument fields, with a one-line warning on dangerous picks. Covered: Pi, Claude Code, Codex, Grok, Hermes Agent, OpenCode and Omp.
  • Agent CLIs: one-click YOLO flags. Codex and Hermes expose their vendors' --yolo, Grok its "Auto-approve tools"; on Codex picking YOLO clears the conflicting sandbox/approvals choices (and vice versa), so the launch never composes a combination the CLI refuses.
  • The Servers panel names what a port is, and can stop it. Each row now carries what the port actually answered (page, api, or nothing yet), the scheme that answered, the process behind it and how long it has been up — and a menu with Copy address, Show terminal, Stop server… and Hide from the list. *Open* only appears where the URL leads somewhere a browser can show: an agent CLI's internal HTTPS control channel is no longer offered as a page it could never be (measured: plain HTTP to that port answers 400 Client sent an HTTP request to an HTTPS server). A port that only answers an API, started outside PiCode, waits behind Show N more. Stop signals only a process PiCode can still re-derive inside one of its own panes, with the pid and the process's start token checked at that moment; a port PiCode cannot attribute is never stoppable. Hiding is keyed by the listener — port, pid, start token — so a new server on the same port is born visible.
  • Forget unused sites (Settings ▸ Browser ▸ Site settings): one action drops the permission entries for sites you have not visited in the last 90 days. Your every-site policies and anything you visited recently are left alone, and the action says what it forgot — or that there was nothing to forget.
  • Agent CLIs: Omp installs and updates per install method. A missing Omp now offers Install through npm (like pi, Codex and Claude Code). Update checks follow the install: npm installs read the npm registry, native installs run omp's own omp update --check and parse its answer. A bun-global Omp is honestly reported as unmanaged — measured, npm would miss the bun copy and omp's updater resolves by PATH — so no update or uninstall buttons propose an action that would hit the wrong installation.
  • Agent CLIs: "Continue in Omp…" works both ways. Omp's own sessions move to any other CLI (it reads its on-disk transcript), and other CLIs' conversations arrive as native omp sessions you resume with --resume <id> — written at omp's own minimal session shape, verified live against omp 18.2.4 before shipping. Omp joins pi, Claude Code, Codex, Grok, Hermes Agent, OpenCode, Muse Code and Antigravity as a full handoff source and target.
  • Agent history access (Settings ▸ Browser): an agent may read where you have been — off unless you allow it, its own permission rather than a side effect of a grant. The browser tool gained the history verb (a search over url and title, newest first, capped at 200 rows) and answers with url, title and time only: no page content, no sessions..
  • Agent CLIs: Omp is a full citizen. Editable launch settings, the PATH wrapper with a presence lease (maintenance subcommands and protocol modes stay out of it), an Activity reporting toggle through omp's own extension API (it reports Ready and Working like pi), and Check for updates — omp update on native installs, npm on npm installs. omp refuses to start when launch arguments carry --trusted-extension next to PiCode's activity extension, so that combination is named in the launch preview instead of starting a broken terminal. Still needs Bun ≥ 1.3.14 on PATH.
  • Agent CLIs: Omp lists its sessions. The Omp pane gains a Sessions tab: its own on-disk sessions under ~/.omp/agent/sessions, grouped by folder, searchable, and resumable — Open in terminal starts omp on that conversation with --resume <id>. Launch settings, activity and managed updates are still without an adapter, and Omp still needs Bun 1.3.14 or newer on PATH.
  • Agent CLIs: Omp joins the catalog. Omp (oh-my-pi, omp.sh) opens a terminal of its own — detection, Check setup (omp --version) and New terminal, with its own card (mark Om, vendor mark). Launch settings, Sessions, Activity and managed updates have no adapter yet: the Launch tab is a read-only preview, its terminals read Open, and install is guided through omp's own docs. Omp needs Bun 1.3.14 or newer on PATH; Check setup reports an older Bun's bundle error verbatim.
  • Add a site exception by hand in Settings ▸ Browser ▸ Site settings: pick a site (or pattern, or *), a permission kind and the decision to remember, and the row lands saved — the same rows the Ask prompt writes, without waiting for a site to ask.
  • Continue in… (and resume) for Muse Code and Antigravity terminals. Stopping one now pins the latest conversation the vendor store holds for that folder, so the sidebar menu offers Continue in… and the launch can resume it — the same pin wrapper CLIs get from their runtime. Sessions predating the terminal never pin.
  • make land BRANCH=<name> — the landing rite from the root: it verifies the branch, refuses when the root's local changes overlap it, fast-forwards main, and runs make ci. It never commits, so it cannot sweep another session's staged work the way a git add -A in the shared checkout once did.
  • *** in a browser grant means any site.** The domains field now takes the one token for "this agent may open anything" (still http and https only), and everything else keeps working as before: exact hosts, *.example.com for a domain and its subdomains, ports ignored.
  • Developer mode — full CDP access in Settings ▸ Browser, off by default and labeled Elevated risk: an agent at the Full tier can name any Chrome DevTools Protocol method, not only the curated ones, and every call it makes — allowed or refused — is listed with the method, the agent and the outcome. Everything keeps working with it off.
  • Update and Reinstall for Muse Code and Antigravity. Both pages now show the blue Update button when an update is available, and the ··· menu offers Check for updates and Reinstall like every other CLI — running the vendors' own commands (agy update; Muse's launcher as its own updater). Neither ships an uninstaller, so uninstall stays a guided link to the vendor docs, same as Claude Code.
  • Browser options menu, matching the reference. The work-browser ⋮ menu now carries Find in page, Print, Zoom (− / 100% / + / reset), Take a screenshot, Passwords and autofill ›, Downloads, History, Clear browsing data and Browser settings.
  • Antigravity reports activity. Working while it thinks, uses tools or starts up; Ready when idle — via a reporter PiCode installs as the CLI's title command (merged into your settings, removed on toggle-off; a foreign title command is refused, never replaced). No hooks.json decision hook ships, so nothing can gate your tools.
  • Browser permissions: Ask. A permission kind can be set to Ask in Settings ▸ Browser ▸ Site settings. When a site asks, the prompt appears in that browser tab with Allow, Block, and Always allow — the last remembers the answer for the site. An unanswered prompt denies itself after a minute instead of leaving the site waiting.
Melhorias · 72
  • Git ▸ Delivery now reads as a page. The view sits centred in one card — the same geometry Agent CLIs uses — with the target, filter, change list, detail and its empty, blocked and error states inside it. Git ▸ History is unchanged.
  • An agent can open the browser beside its session and drive that tab. open launches the split; navigate, click, type and press run there, and you see the same page. Closing the split stops it. This is not a headless browser — unattended browsing stays on the runtime's own tool. Raw protocol still needs Developer mode and the Full tier.
  • Keyboard is rebuilt (Agent CLIs → a CLI → Keyboard). One row per action, the chord drawn as a keycap (mono, 24px — it used to be a 36px box the height of a form control), the row's own Add key and Reset in a fixed column at the right edge, and a toolbar with the filter, a Key filter and facets that count: Changed, Shared, Off. A key two actions share is reported, not called a conflict — 52 of pi's 90 actions share one on purpose.
  • The row is the action, its chords, and what they mean, on one line. The label is bounded and the keycaps follow it (they used to sit at the far edge of a 1240px card, hundreds of pixels from the action they belong to), the note about a shared or browser-kept key sits between them and the row's own actions, and a row is 32px — 48 with a note. 90 rows are ~3 200px of list, not the six screens of air an earlier build drew with the label, the keycap and the note each on its own line.
  • The toolbar holds one line. Only the filter field gives up width when the pane narrows; the facets keep their labels and the row count and Reset all stay on that line. On a phone the bar wraps instead — filter beside the button, facets on their own row — and the count is left to the chips, which already carry it.
  • A row that differs from pi's default wears the accent bar the settings rows already use, and the pane names the file it writes (~/.pi/agent/keybindings.json).
  • The key map's own chords read as keys (Ctrl+B, Page ↑) rather than the file's spelling.
  • Apps in the sidebar can be rearranged. Drag a tile anywhere in the grid. The order is saved and stays after a reload. A search still filters the grid and does not change the saved order. New apps land at the end.
  • Dragging a sidebar row shows where it will land. The row in the list becomes a quiet dashed slot and slides into place. A lifted copy follows the pointer, and the neighbours ease over in a short move.
  • The sidebar keeps the order you leave it in. Drag a workspace by its name, or an agent or a terminal by its row, to move it within that list. Agents and terminals stay in their own blocks. The same move is Move up and Move down in the row's menu. A new workspace or terminal lands at the bottom instead of sliding back into alphabetical order. The browser, the desktop app and the phone show that same order. A drag does not move an agent into another folder.
  • The tray menu is product-first. New browser tab (redundant with the work browser's own new-tab button) and Test notification (the Phase 1 notification spike) are gone. Management… moved up beside the actions it belongs to, and the owner-acceptance spikes — Browser lab and Computer lab — now sit under a single Labs ▸ submenu instead of the main list.
  • The tmux guard moved to Agent CLIs. The switch left Terminal defaults: that page is font, color and tmux options a terminal inherits, and the guard is none of those. It now sits above the CLI catalog on Agent CLIs (desktop and phone), and still applies to every terminal opened from then on — not to the CLI selected below it.
  • Providers is one pane for every agent CLI: pi's roster moves onto it (Add provider, custom endpoints, Use, Pause, Sign out all still there) and the other eight gain what only pi had — Usage windows per account with a one-call Check, and 7d spend from your own sessions. Same columns, same words, one place per account, whichever CLI you open.
  • Plugins are cards now, two per row. The installed and marketplace lists of the other agent CLIs read as a grid of cards like Pi's Packages: name, version and the → 0.3.0 marker when the CLI's own catalog has a newer release, the plugin's description, its scope and origin, and its actions on a footer that lines up across the row. One column on a narrow window or a phone.
  • A plugin the CLI reports as turned off keeps its buttons at full strength — Enable is the way out, so it no longer looks disabled too.
  • The attach bar follows the terminal's theme. Under a dark terminal in a light app (or the reverse) it rendered in the app's colors; it now reads the terminal's Light/Dark choice and flips with it, live.
  • Terminal defaults moved into the user menu. The gear is gone from the Terminals header; search "terminal" in the bottom-left menu (or pick Terminal defaults) to open the same global page. Per-terminal settings in pane menus are unchanged.
  • The header globe opens a browser bound to the selected agent (or agent-CLI terminal). Shift+click, or Open in new tab, still creates a tab with no agent.
  • Providers: a guided Sign in starts a CLI's own login (its binary, its browser or device-code flow) from the pane — finish it, press Check now, and the account lands in the vault. Muse's subscription login is read and written correctly (its own file shape), a second subscription of a store that names no account can be kept by naming it, and Codex, Grok, Hermes and Antigravity keep two subscriptions apart automatically from the account their own files carry. Vault rows a CLI's file cannot name are matched by the token they were saved with — no network call in a pane load.
  • The Memory pane no longer sits flush against the tab bar, and its toolbar is one cluster on the left: the store switcher and the filter sit together instead of the filter floating alone against the right edge. The row is gone entirely when there is nothing to switch and nothing to filter.
  • A read-only CLI now names its clear command inside the sentence, with a plain Copy button — the button used to read "Copy grok memory clear".
  • The old mobile #/changes screen retired into the Inspector's Changes segment; existing links redirect.
  • The first time PiCode writes a CLI's login file it keeps a copy of what was in it (~/.picode/credfiles/<cli>-<time>.bak) and tells you where.
  • Nothing about a CLI's home changes: no new folder, no HOME-style variable, so settings, sessions and memory stay exactly where the tool expects them.
  • A setting added to Pi's pane now takes one edit instead of two. The list that decides which value each layer shows is derived from the same table that declares the rows, so the two cannot disagree — a key added to only one of them used to render an empty control beside a row that said the value was set here.
  • Pi's Settings rows come from the same table as every other CLI's. All eleven are declared in one place with their group and order, so the pane reads as one product with the other eight and a setting pi gains is a line rather than a component edit. The three rows that are not simple values — the model defaults, scoped models and the tool grid — keep the controls they always had instead of being flattened into something they are not.
  • Pi's provider accounts moved into an encrypted vault (credentials.json beside its key, both readable only by you). Existing accounts are carried over the first time PiCode starts after the update; the old file is left where it was.
  • A backup with secrets carries the vault but never the key that opens it: a snapshot restored on this machine keeps working, and a copy taken to another machine cannot be decrypted. That is the point of storing the keys encrypted, and it is the one thing to know before moving a backup around.
  • A setting that is on or off looks the same everywhere. Every pane now uses one switch for a boolean instead of a switch in Pi's and a checkbox in the other eight. A switch cannot show "nobody set this", so a row nobody set is drawn at the CLI's own default and the line beneath it says whose default that is.
  • A capture whose tab closes mid-flight now reports "the tab closed while the capture was in flight" instead of "capture timed out" — the same refusal, naming the right failure.
  • Mobile agent cards now match the terminal cards: the status chip reads the agent's real state (working with an activity age, needs you, open, stopped) and the row menu carries the full lifecycle — start/restart/stop, open chat or terminal, launch settings, continue in another CLI, rename and remove.
  • Route bound interactive agents through the shared terminal identity on mobile and expose terminal attachments in the agent view.
  • Keep the desktop agent Chat/Terminal switch icon-only with accessible labels.
  • Legacy unbound Pi interactive sessions retain their existing agent endpoint until restart; new sessions use the bound terminal identity.
  • Agent and workspace cleanup now closes bound terminal panes through the canonical terminal identity.
  • Saving a guest CLI's setting keeps the rest of the file byte-for-byte: comments, key order and every key PiCode does not know survive, and a file that changed on disk since it was read is refused instead of overwritten.
  • Other Agent CLIs keep their native session-storage behavior. PiCode does not emulate per-agent /resume isolation for runtimes without a dedicated session-directory boundary.
  • The terminal settings report the tmux that is actually serving your terminals. After a tmux upgrade the new program can talk to the older running server; the version shown on the System page (desktop and mobile) and in the tmux app's server view is now the server's, not the new program's.
  • The prompt door now verifies deliveries for CLIs with a measured input reader: the composer must read empty before and after, and refusals name themselves (working, needs-you, occupied, busy). The response carries a delivery receipt; CLIs without a reader answer "unverified".
  • Automations can target CLI agents: the prompt is delivered through the agent's launch terminal via the door, and the receipt becomes the run's outcome (done / skipped / failed with the door's named reason).
  • The graph and pane ask on a non-pi CLI terminal is delivered through the door (fire and forget, provenance recorded).
  • Pi agents reach full row parity with the other agents: the face wears pi's favicon (same art terminal rows use), and the menu offers Continue in… from the agent's own pinned session — the same submenu the other agent rows have.
  • A CLI agent row offers Continue in…: a conversation pinned on its terminal continues in another CLI, the same submenu terminal rows have.
  • The address bar says "Enter a URL". It promised a search ("Search or enter a URL") while typing a phrase produced an invalid-URL error; search from the bar is its own decision and is not built.
  • Naming: CLI runtime agents are called CLI agents — "guest" is gone from code, copy and docs.
  • A guest agent's launch now carries PICODE_AGENT_ID, so picode mcp and the computer/browser tools resolve the agent as the caller — grants given to the agent in Settings match without per-terminal setup.
  • Inbox "needs you" items for a guest are filed for the agent (not the terminal), close when the agent or its terminal is deleted, and their Open terminal action follows the agent's bound terminal.
  • A guest agent row (and the collapsed faces strip) now wears the CLI's favicon — the same identity terminal rows use — instead of a letter fallback.
  • Guest agent rows (Claude Code, Codex, …) name their CLI instead of "Pi agent", show the terminal's status, and carry Launch settings and Start/Restart/Stop terminal in their row menu. Mobile starts and stops guests through the same terminal launch.
  • Connectors show real status for Claude Code, OpenCode and Hermes. Rows in those Connectors panes now report Live or Failed from each CLI's own status report — no more guessing whether a service actually answers. The other CLIs keep their honest "configured" state (they expose no status signal to read).
  • Cancelling an annotation (or removing it, clearing the set, or leaving the mode) puts the page back exactly as it was found.
  • Guest CLI workspace instances are agents only. Leftover managed-CLI bindings become agent rows; the extra table is gone.
  • New → Agent in a workspace picks Pi or any installed CLI. Claude and the others are agents now; Agent CLIs stays the place to install and configure runtimes.
  • An agent names which CLI it is (Pi by default). Play/managed start still only works for Pi; Claude and the others stay in the terminal for now.
  • ask_human over MCP waits for you. The call now stays open until you answer in the Inbox (hours if needed), keeping the CLI's tool call alive with progress reports, instead of handing the wait back to the agent every 90 seconds.
  • Connectors get a Marketplace, like Packages. The pane now has Installed | Marketplace tabs: search a curated catalog, pick Save to, press Add — the dialog is gone. PiCode's own connectors stay pinned at the top, and every agent CLI's pane works the same way.
  • The catalog goes beyond the hand-picked few. Marketplace search covers a curated slice of the official MCP Registry (verified, remote servers), synced in the background and cached — it answers even when the registry is unreachable.
  • The computer tool acts only in the window the agent last saw. A click, a keystroke or typed text is refused (foreground_changed) when the window in front is no longer the one the agent last captured or focused, so the agent looks again instead of typing into what you are using.
  • Connectors are now verified against the real vendor CLIs. Every agent CLI's Connectors pane — Claude Code, Codex, Omp, Antigravity, OpenCode, Grok, Muse Code, Hermes Agent — was checked live against the installed binaries, and the differences found are fixed: what you write in PiCode is what the CLI loads.
  • Apps: web apps with their own window identity take the whole tab. The title bar is gone — an installed web app that declares standalone mode fills its tab edge to edge; Ctrl+F finds in the page and the usual browser keys just work.
  • Apps: web apps with their own window identity open like apps. An installed web app that declares standalone mode now fills its tab — no address bar, just a slim title with the app's name and a menu for browser actions.
  • Apps: installed web apps now install as themselves. When a site carries a web app manifest, PiCode reads its name, icon, colors and start page — a bare address launches where the app says it should start, and the install dialog tells you it found one.
  • Agent CLIs: launch profiles open by default once a CLI has at least one profile, instead of hiding behind a collapsed section.
  • Connectors foundation for every agent CLI. Connector capability is now a declared per-CLI driver registry, and /api/mcp rejects requests naming a CLI without a driver instead of silently writing Pi's files. Pi behavior is unchanged.
  • Browser tool: a screenshot reaches the agent as an image. browser screenshot now hands the capture straight to the model instead of writing a PNG to a temp path and returning the path — one call to see the page, no read after it.
  • Muse Code and Antigravity launch through the PATH wrapper like every other CLI. Same presence lease, same native runtime registration, no more launch carve-outs. Reporting is unchanged: Antigravity through its title reporter (now with a runtime behind it), Muse Code honestly Open (its hooks carry no terminal identity). Maintenance subcommands (muse exec, agy update, …) skip the lease.
  • Muse Code lifecycle docs: R3233 grew real hooks, but they cannot feed per-terminal activity (see the plan note), so Muse stays honestly Open.
  • A session note's ## Debts bullets now say so at closing time: they ride the board for 7 days, so the durable ones name the topic file that owns them.
  • The handoff board never blocks a session again. It is a bounded view (two next steps per topic, session notes for 7 days, open debts only) and warns instead of failing when it is over its target, so make close no longer stops on how much the team wrote down — and nobody prunes another session's bullets to make it fit.
  • Debts carry their state: - [x] marks one paid in the topic file that owns it; the board shows the open count and keeps the record.
  • The options menu opens over the page instead of pushing it down.
  • The Activity seed now runs as v2 so hookless-except-by-reporter CLIs are picked up on existing installs; owner-switched-off stays off.
Removido · 3
  • The tray's disk line and Give back item. The tray no longer shows the WSL … GB · ≈… held by Windows · C: … free line or Give back ≈N GB…. The disk facts and the give-back flow live in the Management window's Disk tab — the surface this change also makes work. Removed with them: the tray's disk poller, the Rust-side compact flow (the Go disk-compact command keeps the readiness interlock), and desktop-shell/src/diskline.rs.
  • Drop the Chat/Terminal segmented control from the tab strip (desktop and browser) and the mobile agent header. Pi still switches from the sidebar / Work list agent menu (Open chat / Open terminal).
  • Connector file import and "use from another app" are gone. The Pi adapter already imports, and each CLI's Connectors pane writes that CLI's own config directly — adding the same service in its marketplace replaces copying it from another app. Custom server… stays.
Correções · 154
  • The "Reconnecting" screen no longer outlives a deploy. The reload watch called its page-availability check without a default, so every automatic reload threw instead of firing, the health poll stopped rescheduling itself, and the app stayed on Reconnecting until a manual reload — in the browser, the desktop shell and mobile. The check now defaults to this page's own path, and a failing check can no longer end the watch.
  • Explain Delivery integration and validation labels in the desktop and mobile views, and remove wording that implied an approval queue or publication status.
  • Add a visual glossary to the Delivery guide and clarify the limits of observed evidence.
  • The mutation gate no longer has the two blind spots it shipped with. It read SQL as text, so a statement assembled from a package-level constant, or a table name its pattern could not spell, went unchecked — both were filed as a known limitation rather than fixed. A write is now either SQL the test can read *or* a call that runs one, which between them have no gap: every write in the store reaches SQLite through one Exec or the other. VacuumInto joins the listed exceptions.
  • The default shown was not always pi's default here. Nine actions bind differently on Windows and WSL — Ctrl+- is Alt+Z on WSL, and Suspend has no binding at all on native Windows. The pane reads the host's platform and prints the binding that machine actually has, with the other platforms' rows on a muted line beneath.
  • The CLI pane tabs no longer run past the card. At 1024px the nine-tab strip (Launch…Connectors) was painted over the page gutter with its last tab cut mid-word; it scrolls inside the card now, which is what the active-tab reveal was always written for.
  • A destructive button reads destructive on desktop. .btn-danger only had a hover rule there, so every confirm drew Remove and Cancel as the same grey button; the phone app had the fill all along. It now has the rest state on both (Reset all is the first one you will notice).
  • Dragging a sidebar row no longer opens a horizontal scrollbar. The reorder stays on the vertical axis. A sideways nudge used to slide the row out of the column, and the list grew a horizontal bar.
  • Renaming an agent left its editor tab on the old name. A non-Pi agent runs as its bound terminal, and the tab strip labels that t:<id> tab with the terminal's own name — a value copied from the agent once, at bind time. The rename route only patched the agent row, so the sidebar showed the new name while the tab kept the one from creation. Store.UpdateAgent now renames the bound terminal inside the same mutation and announces terminal.updated, so the strip, the dashboard fleet and every other term.name reader follow the rename; a same-name patch emits nothing.
  • Two gates added yesterday were passing work they claimed to check. The ADR status check could not read - Status: accepted (the colon inside the bold), so ten of 171 decision records were silently unchecked; an unreadable status line is now a failure rather than a skip, and all 171 are covered. The mutation gate scanned only each method's own body for SQL, so seventeen exported mutators that delegate their write — AddAgent, CreateTerminal, EnablePeer, ReplaceFrom and fourteen others — were never required to announce anything; three of them announce nothing and are now listed with a reason. It also read comments, so "we deliberately do not AppendEvent here" would have satisfied it.
  • Git now uses one workspace selector above History and Delivery, and keeps the selected view when switching workspaces.
  • Providers: Sign in reuses the CLI's sign-in terminal that is already waiting instead of stacking a new one per click, and sweeps the husk a dead session leaves behind.
  • The Management window answered "not allowed by ACL" on every tab. Its seven commands — disk_report, disk_compact, disk_compact_dry_run, clean_list, clean_apply, wslconfig_read, wslconfig_write — sat on the ACL guard's exception list under the wrong assumption that no webview invokes them. The Management window is a served webview, so Tauri refused each call. They now live in a dedicated management capability (desktop-shell/capabilities/management.json), the exception list shrinks to the one genuinely tray-internal command (computerlab_open), and the guard test enforces the management commands too.
  • clipboard_files was missing from build.rs's command manifest. It was registered in generate_handler! and granted in capabilities/default.json but absent from AppManifest::new.commands(&[…]) — the one-line gap the same guard test flags, and one a fresh permission regen would have surfaced as a dangling capability reference.
  • Providers: Check now no longer treats the account already in the file as a finished sign-in. It stays on the strip and says so, until the CLI's file actually holds a different login.
  • Check for updates stays when a CLI has one plugin, or none. The control lived inside the filter bar, which only renders for two or more installed plugins, so Claude Code (one plugin) and an empty list had no way to run the check the pane itself says is how Update appears.
  • A group count is a number, not a toolbar pill. The header reused the filter's bordered count chip, so "59" read as a stray button next to "Ships with the CLI".
  • The API reference was missing every authentication route. /api/auth/session, /api/auth/sessions, /api/auth/logout, /api/auth/mode, /api/auth/pairings, /api/auth/token/rotate and the device-revoke route are served by the daemon and were absent from the published OpenAPI document — the surface an API consumer needs first. The generator records routes against an empty dependency set, and auth registration returned early when the gate was absent, so nine patterns were never recorded. CI compared the committed file against that same generator, so it stayed green. The spec now lists 338 paths, and the generator's x-undocumented names the two non-JSON routes it still leaves out (/pair, /preview/**) instead of implying they do not exist.
  • Restoring a backup could destroy what it was restoring. Pin attachments and pi session files were deleted first and copied second, with no rollback, after the database had already been swapped in — so a copy that failed partway (full disk, one unreadable file) left the live files gone and half rebuilt. Each directory is now built beside the live one and renamed into place, and the credential vault a restore replaces is kept as credentials.json.replaced.
  • Eight accepted decisions were still listed as proposals. ADRs 0110, 0120, 0135, 0142, 0150, 0153, 0155 and 0157 said accepted in their own file and proposed in the index, which reads as half the recent work being speculative.
  • CHANGELOG.md told agents to do what the commit hook refuses. Its own header asked for an entry in [Unreleased]; assembles this file from docs/changelog.d/ fragments and the hook blocks the direct edit. The header now describes the fragment flow, and the hook allows a correction to the preamble above the first version heading.
  • Three broken links in docs/architecture/, a subsystem file (devservers.md) that the architecture index never linked, a source comment pointing at a handoff topic that does not exist, and three forms that did not opt out of native browser validation.
  • Claude Code's installed plugins no longer disappear. The pane reads the machine scope by leaving scope out of the query, and the roster read passed that empty scope through: Claude Code's rows name their scope (user), so every one of them was filtered away and the pane showed an empty list for a CLI that has plugins. The read now resolves the scope once — empty is the machine scope — for the list, the catalog and the update check, which is also the key they share in the cache. Regression test: TestTheDefaultScopeReadsTheMachineScope.
  • Providers: the sign-in strip now carries Open terminal — the terminal the sign-in runs in is one click away, instead of the strip telling you to type /login somewhere it never named.
  • An empty Inbox names its next action. With nothing waiting but items already answered, the blank slate was a dead end (“Nothing needs you right now.”) while the Done strip sat a tab away; it now carries the action — “See the done item” / “See N done items” — which lands on that strip. A mailbox with nothing at all keeps the one line, because there is genuinely nowhere to point.
  • Omp shows what its marketplaces offer. Its plugin catalog was reported as unavailable; PiCode now reads omp plugin discover and lists the plugins a source offers, each marked installed when it already is. Omp's list does not say which source provides a plugin, so those rows are information and the list states the install form (name@marketplace) instead of offering a button that would run the wrong command.
  • OpenCode's plugin list says when a config is broken. A "plugin": "name" string is refused by OpenCode itself ("Expected array | undefined"); PiCode used to list it as an installed plugin. The pane now names the file and the form OpenCode expects.
  • Attach now verifies the terminal sent the message. The paste plus Enter raced the TUI render, so the text sat in the composer while the bar cleared. The paste path polls the live pane until the composer reads empty, retries Enter once, and answers 502 staged (bar stays open with the reason) instead of a blind success. TUIs without a reader keep the previous behavior.
  • The attach bar closes after sending and hands the pane its keyboard back. Failures keep it open with the text staged, as before.
  • The Inbox no longer promises a pickup nobody made. Answering a question whose source has no reply channel records the answer on the item (so the human's Reply closes it), and the note said "the CLI that asked will pick it up here" — true for picode inbox ask --wait, false for a plain ask and for a pi launched outside the launcher, which read the durable queue instead. The note and the toast now name both paths: a waiting asker reads it here, a non-polling asker must be told another way.
  • Providers: the pane's action bar lays its controls out as one group at the right edge — the account count on the left, Sign in and the single Add API key beside each other instead of a button floating mid-row, and a multi-provider pane no longer shows its own Add directly above the first provider's.
  • Desktop/Web: removing the agent whose tab you are on no longer lands on a dead surface. Selection now moves to the neighbouring tab (right, else left), and to the dashboard when no tabs remain. Closing a tab picks the same neighbour instead of jumping to the last tab. A CLI agent's bound terminal tab and a removed workspace's tabs follow the same rule.
  • Muse Code's plugin catalog is actionable. A catalog row now carries the spec the CLI installs from (name@marketplace) and the path the marketplace resolved, so Install in the Marketplace tab runs the right command.
  • Marketplace rows say when a plugin is already installed. Muse's own catalog keeps answering available after an install, so PiCode joins the catalog with the CLI's own list and shows Installed instead of an Install button for something that is there.
  • Context menus that open over the tab strip no longer paint behind it.
  • Muse Code's own plugins are listed. muse plugins list nests each plugin under record and plugin, which PiCode read as a list with no names — so a machine that has Muse plugins saw an error where the list belongs. Install, remove and enable/disable already worked and are unchanged.
  • The Muse plugin surface is per machine, and the pane says so. Muse turns its plugin commands off through its own cached feature configuration; when that is the case the CLI answers *"plugins are not available in this build"* and PiCode shows the CLI's own sentence instead of an empty list.
  • Answering a question filed by a CLI with no PiCode identity (a guest running outside PiCode) now records the answer on the item, where the asking CLI picks it up. The Inbox used to refuse with "no reply channel" and the item stayed open forever, leaving the asker waiting on a poll that could never end.
  • Ctrl+V / Ctrl+Shift+V now attaches images in terminal panes. The keydown used to kill the browser's own paste (stopping xterm's ^V) and then read text only, so an image clipboard pasted nothing at all. It now re-reads the clipboard (files included) and fires an equivalent paste, routing through the same attach bar the native menu already opened. Text-only pastes behave exactly as before.
  • The PiCode menu's Paste row stages files. It read text only and dropped images silently; with files on the clipboard it now opens the attach bar, like the keyboard does.
  • Fix the work-browser split ("Open browser" beside an agent/terminal) in the /browser/ web app: the tab strip spans the top and the agent and browser panes now share the row below, so the terminal no longer crushes to a sliver and the browser pane no longer pushes off-screen. Desktop behavior is unchanged.
  • Settings ▸ Browser/Computer audits: a refused call reads neutral (the policy working as intended) and only failures read danger; the outcome filter lists every outcome present in the data.
  • Terminal paste now answers the same door as the Attach menu. An interactive agent pane whose bound record carries no launch fields no longer refuses a files-paste the menu would accept.
  • A double-paste stages both pastes. Rapid Ctrl+V,V used to keep only the second files; concurrent stages now append functionally under the 4-file cap.
  • Text pasted alongside files seeds the message. It used to be dropped (or land stray in the terminal when clipboard-read was granted); the keydown path's late text is now claimed away for that gesture.
  • Settings ▸ Browser and Settings ▸ Computer now fill the full page card instead of a narrow 780px column, and all row controls share the 36px control height.
  • Agent permission lists carry workspace provenance on every row (workspace chip resolved via /api/workspaces, plus managed/terminal kind), with a search + filter toolbar and paged rendering instead of one unbounded list.
  • Recent steps (Computer) and Raw calls (Browser) are filterable by search and outcome, with expandable rows showing the full reason, actor and timestamp instead of a truncated single line.
  • Codex's Memory pane no longer offers to copy codex as "the vendor's own command" — that command does nothing to a memory, and the pane now shows the note alone.
  • Mobile Inspector: Git actions now address the checkout under review when following a sibling worktree (branch and upstream come from the followed checkout, not the anchor), and the agent screen's review glance clears instead of freezing when the agent's folder moves.
  • Agent CLIs: Omp terminals now report Needs you. The omp reporter only knew pi's event set, and omp never fires those — so an approval or a question waited in the terminal while the row said Working. The extension now listens to omp's own events (tool_approval_requested/resolved and the ask card's tool_execution_start/tool_result, verified against the 18.2.6 bundle), files the same Inbox item the other CLIs file, and only settles on agent_end when the run is really over (willContinue marks a mid-run turn).
  • Verify on a saved key spends exactly one listing call to the provider, named on the button, and stores the answer with its age on the account's row. Nothing else in the app talks to a provider about credentials.
  • Hermes' Show reasoning row said Off when Hermes turns it on. Every boolean now declares what its CLI does when the key is absent, checked against a recorded table, so a row left alone shows what will actually happen. Hermes' turn limit says 20 rather than a vague "default".
  • A terminal no longer dies the moment it opens on a service without a SHELL setting. The daemon fell back to /bin/sh — dash on Debian-family systems — and handed it a bash-only argument, so the pane exited before the first prompt and took its tmux server with it while the app still showed the terminal as running. The fallback is bash now, and the argument goes only to a shell that accepts it.
  • Opening a terminal whose shell exits immediately reports the failure and keeps nothing behind, instead of leaving a terminal that reads as open with no session to attach to.
  • A boolean row in Pi's Settings now uses the same switch as the rest of the pane instead of a second control for the same job.
  • Inspector Git menu hints now carry the exact prepared command as a hover title, including the real branch on git push -u origin.
  • The session Changes cap note reads "+N more copies of the project not scanned" instead of jargon, with the linked-checkout explanation on hover.
  • Use the Agent CLIs terminal screen for mobile TUI agents, including touch scrolling, menus, attachments, keyboard controls and recovery states; show Pi's Chat/Terminal switch as toolbar icons.
  • Share terminal input and connection wiring across browser, desktop and mobile; preserve live legacy Pi addressing without retaining a second terminal renderer.
  • Keep bound terminal identity and actions consistent across agent views, terminal links and Canvas; open non-Pi agents in their TUI and keep Pi's view switch in the existing tab toolbar.
  • A guest CLI's setting could be written to the wrong key. In YAML, a path like memory.memory_enabled matched a block of the same name nested anywhere else, so the save landed on it and the key the pane showed never changed. The locator now anchors the first segment at the document's top level and keeps every next one inside the block its parent opened.
  • TOML writes could land inside a multi-line string. A """…""" body containing key = value or [table] lines was scanned as configuration, which rewrote the user's prose and could silently retarget a save. The scanner now tracks string state, and an array of tables is refused rather than edited.
  • JSON writes could shadow a value. A key present twice was written on the copy every parser ignores, and a path whose parent was a string, an array or null appended a duplicate member at the root. Both are refused with a sentence naming the file.
  • Handing a key back could delete more than the key. Emptying a YAML block swallowed the comments and blank lines that followed it, which emptied a file whose block was followed by commented-out configuration.
  • A file with no final newline, and a JSONC file with a comment before its closing brace, can now take a new key instead of refusing every save.
  • Claude Code's Approvals row could not show the value in the file. The options were missing auto and dontAsk, so a machine set to auto drew a blank control and any choice moved it off. OpenCode's autoupdate row is withdrawn: it is true, false or notify, and a switch would destroy the third. Grok's options now match what that CLI accepts.
  • Pi agents now open the same contextual Launch settings editor as other Agent CLIs. Model, reasoning, tools and checklist remain under Settings; bound agents keep their CLI fixed and Pi launch controls omit reserved model and reasoning flags.
  • Keep a one-time browser permission answer from becoming a remembered site permission.
  • Session Changes no longer corrupts fleet pills. Linked-worktree watcher events are path-only, so the workspace and agent pills keep describing the anchor folder while followed groups still update live.
  • A file tab whose worktree checkout is gone now reads "That file is gone." instead of the raw server message.
  • The tmux app's server view no longer shows an empty version and keyboard mode while a drained session is answered by the older server.
  • Pi agents in terminal mode now reuse the shared CLI launcher and activity integration, including working, needs-you and idle states across desktop and mobile. Existing open Pi terminals remain usable until explicitly restarted.
  • Pi terminal and chat transitions now share lifecycle guards, preserve agent session ownership and refuse replacement while a previous process is still closing. Agent launch settings remain available alongside Pi-specific configuration.
  • Refresh the Windows desktop's native chrome region when its viewport or display scale changes, so maximizing or restoring a window without an active work-browser page does not leave the interface clipped to its previous size.
  • Keep desktop work pages visible and live beneath address suggestions, menus and dialogs in the updated Windows shell. Native regions preserve the existing HTML controls without capturing the page; older shells retain their previous behavior until upgraded.
  • Agent CLIs Update on an npm-global Pi runs npm install -g instead of pi update, which refuses when the package dir is not writable (a sudo npm install into an nvm prefix) and leaves the button failing.
  • Bind newly created interactive Pi sessions as soon as their JSONL file appears, so the agent menu exposes Continue in… without a manual Sessions refresh.
  • Allow a bounded Muse index-update window when pinning a terminal's latest session, reducing the shutdown race before the index is refreshed.
  • The Windows installer no longer hides a failure: the launcher waits for the elevated run and reports its exit code, the last error line is written to %ProgramData%\PiCode Desktop\install.log, and the elevated window pauses for Enter instead of closing with the evidence.
  • install --user <name> now aims the picode binary and pi at that account (and --user root keeps the system-wide install); stage scripts no longer rely on $ surviving the wsl.exe argument boundary.
  • Removing an agent no longer leaves the row behind when the delete response is lost: "not found" is treated as removed and the fleet is refetched, so a second remove cannot fail with "agent not found".
  • Use consistent Start, Restart and Stop agent actions across workspace agent menus, with shared ordering, capability-specific options and separated removal.
  • Offer scoped launch settings and confirmed restart for Pi agents; restarting preserves the managed or interactive mode and reports failures without claiming success.
  • A Send with three or more annotations no longer fails: it used to hit the prompt door's four-file limit and deliver nothing while keeping the notes in the store. A Send that cannot be staged whole now stages nothing at all instead of half a package.
  • The stale btab_layer permission artifact is gone; the generated schemas no longer advertise a command that does not exist.
  • The annotation card's "Background" row no longer truncates its label: the label column fits every row's name at the card's own width.
  • The annotation screenshot shows the page, not our own annotation UI: the pin, the chip and the card are hidden for the instant of the capture, so the agent receives the element instead of a picture of the card covering it.
  • A missing annotation screenshot now says why instead of vanishing: the Send names the step that gave up (and the shell's own words when the page capture is what failed), and the capture retries on a short ladder so a moment of hidden page does not cost the picture.
  • Annotation screenshots actually arrive: the crop asked the shell for the page preview with the React tab id, which the shell could not resolve, so every Send staged the note alone and the picture failed in silence. The shell now resolves either id shape and the call site passes the native one.
  • Mobile tab bar docks to the bottom of the screen. On an iPhone home-screen install the bar grows into the system letterbox instead of leaving the tabs floating above a blank strip. Pick Low in Layout if a label is clipped.
  • Mobile terminal uses the bottom of the screen. On an iPhone home-screen install, a pushed screen (terminal, agent) grows into the system letterbox instead of leaving a blank band under the TUI.
  • The phone Work list ⋯ on a terminal is no longer only Remove: Rename, Continue in…, Start or Restart/Stop, then Remove — the same menu as desktop, without Launch and Terminal settings (those stay in Agent CLIs and the open pane).
  • Mobile header is no longer frosted. The iOS home-screen app uses an opaque status bar, so iOS 26 Liquid Glass does not wash out the title and icons at the top of the screen.
  • Restart terminal on an Agent CLI now reopens the conversation that was running (the pinned session's verified resume arguments), instead of starting a blank chat. Stop then Start, and Resume last session on a stopped terminal after a crash, stay as they were.
  • Connector gallery refreshes no longer race over the same cache file: two at once (the background timer and a manual refresh) could make one fail with "no such file or directory" and the gallery answer an error. The cache write is serialized and uses a private temp file.
  • Annotations reach the strip even when the page cannot post to the app: the annotate strip now asks the host for the page's state on a slow tick (a path that needs no page-side bridge), so the count and Send light up and the batch carries the real payloads.
  • The work-browser page is created with web messages enabled, instead of enabling them only when annotate mode is armed — which left the already loaded document without the channel.
  • Annotate mode survives a full page load: the shell re-injects the in-page script when a navigation completes, so the overlay no longer vanishes while the strip still says it is armed.
  • Annotation Send lights up again: the page's message channel is re-subscribed on every arm (a webview recreated under the same tab id used to inherit a stale subscription and go silent), the receiver is dropped when its tab closes, and a page that does not answer is retried once and then named out loud instead of leaving a dead Send.
  • Re-arming annotate mode keeps the pins on the page and re-reports them.
  • Typing in the annotation card no longer triggers the page's own keyboard shortcuts: keystrokes are shielded at the card's shadow root, so a site hotkey (GitHub's "s" opened its search) can no longer steal focus and swallow the character mid-word.
  • Enter saves the note again — it had never worked, for the same reason (the event target outside a shadow root is the host, not the input).
  • Annotating no longer loses the draft: while a card is open, page clicks, pins, chips and menus do not steal it onto another pin — Save, Cancel, Esc or trash first, then pin the next one.
  • Annotation Send delivers to the bound session: a browser pane open on an agent or terminal tab sends to that session's chat (agent prompt door for agent panes, terminal prompt door for terminal panes). A bound miss never reroutes to a stranger's terminal — it names the reason and keeps the notes. Standalone tabs keep the first-running fallback.
  • computer typing under load. Characters the keyboard layout has are now typed as keystrokes (with Shift when needed), which carry their own character and survive a busy app; only characters the layout lacks, AltGr characters and dead keys still travel as Unicode packets. Pacing alone (the earlier fix) still garbled text when the app fell behind.
  • Annotation Send delivers again: it posts to the prompt door ({message, paths} pasted into the agent TUI), not the file-drop door — which answered 400 while the toast blamed the terminal. A refused paste now names the server's reason.
  • Annotations reach the strip again: the page posts message objects (the host serializes once) and the chrome unwraps at any encoding depth, so a saved note always shows up as Send N instead of a silent Send 0.
  • Apps: Clear data now waits its turn. Clearing right after using an app could fail silently ("Could not save the web app") because the app's files were still being released. The clear now waits up to ten seconds and, if anything still blocks it, says exactly what.
  • computer typing came out as one repeated character. The desktop app fired every Unicode key event back to back, and Windows 11 Notepad read each one as the last character of the text. The app now paces characters 5 ms apart and types at most 2 000 characters per call, so type writes what the agent sent.
  • Annotate hover no longer starts dead: the highlight shows from the first mouse move and stops while a card is open (open-state travels in flags, never in inline styles). First-press Esc exits the mode again.
  • Claude Code connectors now save correctly from the pane. The add command PiCode runs now matches what claude mcp accepts, and rows read from claude mcp list keep their address and kind.
  • Codex and Antigravity save to the one config file each CLI actually reads. The "This folder" target refused instead of writing a file the CLI never loads.
  • Grok connectors can be turned on and off again. The switch mirrors Grok's own enable/disable, and removing a connector no longer leaves stale entries behind.
  • OpenCode connectors land in the file OpenCode itself uses (opencode.jsonc when present), so edits are never shadowed.
  • Muse Code connectors no longer produce a settings file Muse rejects (the required schema_version stays present), and Grok rows report their enabled/disabled state.
  • Annotate mode no longer dies on the ACL (the command was missing from the shell manifest) or on Send (the page URL ref did not exist).
  • The fallback preview no longer blanks the app when a second note is pinned (the event was read after React released it).
  • A malformed connector config file (JSON, TOML or YAML) no longer fails the Connectors pane with an error — the pane names the file and carries on.
  • desktop: deploys and shell swaps no longer end every terminal. The WSL distro's keepalive moved out of the shell process into a scheduled task (PiCodeDistro) that outlives it: a make desktop-restart, a shell crash or any taskkill can no longer leave the distro unowned for WSL's idle reclaim — the failure that killed every tmux session, agent and terminal at once (2026-09-18, four times). The task's action wraps wsl.exe in a headless conhost, so the keepalive holds the distro with no console window on the desktop. The shell ensures the task on its health poll (child-spawn kept as fallback), and desktop-swap.sh ensures it before killing the old resident. Also fixed: make adr failed whenever a registered worktree's directory was pruned.
  • Desktop: the shell no longer bricks on a daemon restart. Back-to-back deploys could leave the desktop app parked on a 404 body forever. The shell now waits for the app to really answer before first paint, and an automatic reload waits for the page to serve again (it never reloads into a dead body).
  • Agent CLIs: no more one-request "Not found" flicker while a CLI updates itself. A vendor updater rewrites its launcher in place; the catalog now retries once before reporting a CLI missing, so lifecycle menus stop flickering off during updates.
  • Windows shell caption buttons and native commands work again. Covering /desktop/ with the app CSP had blocked Tauri's IPC (http://ipc.localhost), so every invoke died in the console. The desktop shell's policy now names that host; the browser and mobile shells do not.
  • claude mcp list output with no servers no longer fabricates a phantom "No" connector row, and the Claude Code driver id now matches the CLI catalog (claude-code), so #/clis/claude-code/connectors highlights the right roster entry.
  • A stopped server no longer keeps its row. The panel's cached probe answer was trusted for two minutes regardless of whether anything still listened, so a server that had just stopped stayed on screen (found in the first QA pass of the rework, minutes after Stop said it was gone). A row now needs the port to be listening at this read, unless a PiCode pane still owns the socket.
  • "unnamed page" beside "not a page". A port that is not a page and has no title shows its port alone instead of borrowing the page vocabulary.
  • Dashboard loads faster. The six CLI meters now aggregate in parallel (cold 7d window drops from ~8s to ~5s on this machine), the server pre-warms the stats cache after boot, and the dashboard paints the last good numbers instantly while refreshing underneath instead of a full skeleton.
  • Desktop: editor tabs can be reordered again — the shell now disables Tauri's native drag-drop handler, which on Windows swallowed the HTML5 drag events the tabs (and composer file drop) rely on.
  • Agent CLIs: an Omp terminal no longer stays Working after it replies. omp never fires the events pi uses to settle a run, so the activity reporter waited forever at Working. omp now uses its own event set — Ready comes back when the reply finishes — and, measured against its approval dialog, it never claims Needs you: approvals happen in the omp terminal itself.
  • Clicking “PiCode” opens the dashboard again in the desktop app. The wordmark in the window's top row was a window-drag region as well as a button, so pressing it dragged the window and the click never arrived; the sidebar wordmark also did nothing while a non-workspace page (Agent CLIs, Browser, Preferences, Devices) was open. Both now open the dashboard, and the top row stays draggable around the button.
  • The browser menu no longer blinks the page. Opening the ⋮ menu while a site is on screen used to park the live page behind a strip of gray for the length of a screen capture; the menu now waits for its backdrop (the frozen frame it sits on) and opens with it — the page never disappears.
  • Opening a link no longer flashes a stray page. A browser tab created before its pane reported its size painted at a placeholder rectangle over the pane's own empty state until the real bounds arrived. Such a tab is now born hidden and appears in place — the moment its rect is known.
  • Ctrl+click on a link in an agent's terminal opens it in PiCode, not in the system browser: a printed URL now follows the same preferences as every other door (Browser settings — local dev sites and web URLs, both defaulting to PiCode's own browser). Set either to "Default browser" to send those links out, and paths under the terminal's folder still open in the file pane.
  • Resetting a site's permission now really forgets it. The shell kept every decision in the engine's own per-origin memory (SetPermissionState) as well as in its map, so "Reset" in Site settings left the site working until the app restarted. A policy write that names a site now tells the engine too, and "Always allow" from the Ask bar writes the site's standing on both sides.
  • A browser grant with domains reads properly (Settings ▸ Browser ▸ Agent permissions): the row stacks — name and what the domains mean, then the tier and the domain field on their own line — instead of squeezing the field to a stub with the select wrapped above it, and the field matches the height of the controls beside it.
  • The browser tool now shows what the act verbs answer. evaluate returns the value (or the page threw: …), navigate says where it went, cdp returns the method's JSON. All three used to be rendered as an accessibility tree, so a call that worked arrived as "the page has no accessible content".
  • Message delivery keeps up with vendor UI changes. Grok 1.0.34 restyled its composer footer and Claude Code predicts dim follow-up suggestions — both silently stalled automatic prompts. Both shapes are now recognized, with the same strict frame, cursor and footer checks.
  • Plan file lists no longer repeat the wrapper entry.
  • Sidebar scrollbar alignment and track. The sidebar's .side-scroll scroller previously lived inside .side-section with an 8px horizontal padding, causing the scrollbar to float 8px away from the right border and look disconnected when scrolling down past the pinned header. The container now spans full width with padding: 0 8px 10px on .side-scroll, placing the scrollbar flush against the sidebar's right edge while maintaining consistent 8px breathing room for item rows and headers.
  • Activity reports without a native runtime no longer 409. Session reports (which carry a session id) used to require a live native runtime, so observers that never start one — the Antigravity title reporter today — had every report refused and their terminals read Open forever. With no runtime entry there is no identity fence to protect, so those reports now land as plain terminal states; terminals with a live runtime keep the strict conflict.
  • The server test suite no longer writes into your real home. Booting a server seeds Activity on and syncs integration files, and the two CLIs installed through your own settings (Antigravity, Muse) resolved the developer's real home in tests that never isolated it. The whole suite now runs under a throwaway HOME (plus XDG), guarded by a test that fails if the sandbox ever goes missing.
  • Menus and other layers no longer come up hidden under the work browser. The editor's tab menus, the command palette, dialogs, dropdowns and toasts now decide by geometry: any floating layer that reaches the page parks the native view and freezes the page behind it. Previously only dialogs did (and only the ones wearing the app's own dialog class), so the palette and every chrome menu could appear behind the page.
  • The domains field says what it means. Each entry is described as you type it — including the shapes that open nothing (*example.com, *., a lone .), which used to be accepted and saved in silence.
  • The JavaScript switch reaches the shell on load, not only when it is clicked: after an app restart the shell's copy of the setting is now the saved one, not its default.
  • The desktop app could not be opened from the tray. With the resident started by the logon task, *Open PiCode* (and a second launch) did nothing: the window was alive but the app's own lookup missed it, so every open path quietly no-op'd. The shell now keeps its window handle and asks Windows directly to restore and focus it.
  • Lifecycle buttons on mobile (and Muse Code on desktop). The Install and Update buttons were gated on the integration capability — inverted on mobile (!cap.integration) — so update-capable rows without it never showed Update. Both buttons now follow only the lifecycle flags, like the ··· menu already did.
  • Work-browser options menu in the agent split. The menu's settings links (Browser settings, History, Downloads, Clear browsing data, Passwords) did nothing in the split pane — that surface never received the navigation callback. They now land on Settings ▸ Browser, like the tab version does.
  • Menu still. An empty page capture used to hide the live page behind nothing (uniform gray). The tab now only hides the page behind a capture that decoded to real pixels; a failed capture keeps the menu usable over the host background.
  • Settings views under a live page. Opening any settings view with a work tab selected left the page painted over it. The tab is now parked while the route is elsewhere and restored on return.
  • Application dialogs (New workspace, confirmations, the Settings dialogs) are no longer covered by the work browser's page.
  • Sign-in popups open as real windows. “Continue with Google” (and the other OAuth providers that open a sized popup) now completes instead of dead-ending: window.open with a size keeps its link to the page that opened it, which is how the credential comes back. Plain target=_blank and unsized window.open still open as editor tabs.
  • Choosing “Platform default” in Site settings now clears the per-kind policy; the choice failed before.
  • The Manage dialogs (Site settings, passwords, and the rest) scroll inside a short window instead of running past its bottom edge, where Close was unreachable.
  • A work-browser tab no longer re-arms its page-metadata poll on every render, which pinned a CPU core while the tab was open.
Segurança · 8
  • Use is refused while a terminal of that CLI is running: replacing a credential under a running agent can corrupt its session. The refusal names how many terminals to close.
  • A CLI whose login PiCode cannot write faithfully says so and offers no control: Omp (its own database), a Grok file with no session yet, and the API-key paths of Hermes and Muse.
  • Credential values never leave the server: the roster shows a masked hint (sk-ant-…f2a) at most, and a vault that cannot be read (missing key, tampering) is reported in words instead of being silently replaced.
  • A memory could be written outside its folder. Containment resolved the target file, which does not exist when one is being created, so a write through a symlinked subdirectory landed outside. It now resolves the deepest existing ancestor, and listing skips anything that is not an ordinary file — a symlink named notes.md had its first line published, and a FIFO hung the pane.
  • A relocated memory folder is bounded to the user's home directory, so the pane cannot be pointed at /etc or /proc from the Settings pane.
  • Masking covers more credential shapes (cloud secrets, password= and api_key: assignments, passwords in URLs, Slack webhooks, PGP and truncated key blocks) and no longer destroys ordinary words: risk-assessment-… was being redacted.
  • Reading a memory refuses anything that is not an ordinary file, so a pseudo-file reporting size 0 no longer walks past the size limit.
  • Memory files are masked on read for credential-shaped values (provider keys, tokens, private-key blocks). The file keeps what the CLI wrote; the browser does not echo a secret back, and memory text never reaches the change feed.

0.3.1

2 correções
Correções · 2
  • The tray reopens the shell again. Closing the shell window destroyed it instead of hiding it, so tray click and Open PiCode silently did nothing. Close now hides the window; reopening returns to the same page.
  • No more console window beside the shell. The shell built as a console app, so every start opened a terminal window titled with the exe path that lived as long as the tray icon. It now builds as a GUI app (debug builds keep the console).

0.3.0

103 novos · 125 melhorias · 102 correções

Novo

  • Terminals appear in Agent permissions: the section now lists the terminals you started in PiCode beside the managed agents — name, tier and domains, with the same editor — and says plainly that a pi started outside PiCode has no identity and always reads the tab on screen.
  • Muse Code and Antigravity accept native handoffs. Continue in… now offers them in native mode, not just brief: the conversation lands as a session their own CLI lists and resumes (Muse: an index row plus a session log; Antigravity: a summaries row plus the brain transcript). Both were proven against the real CLIs, including a same-shape round trip before the write counts.
  • Terminals are listed as principals in the browser grants API: GET /api/browser/policies returns each terminal with its effective grant, and POST /api/browser/policy accepts term beside agent — the key carries the namespace (term:<id>), so a terminal can never widen an agent's grant or the other way round. The settings rows that show them are the next slice.
  • One release, two binaries, one resident to swap. The release workflow builds picode-shell-windows-amd64.exe beside the Go binaries (Rust + cargo-xwin recipe, proven on a fresh Ubuntu 24.04 container) and stamps the tag into the shell. picode-desktop update downloads both exes, verifies them against SHA256SUMS — refusing an unverified binary like the daemon's updater — and swaps both or neither, rolling the tool back if the shell fails. scripts/desktop-swap.sh relaunches whoever the PiCodeDesktop task points at (tray today, shell after the migration).
  • Terminal agents identify themselves to the built-in browser: the browser tool now sends the house identity tuple — managed agent id first, then the PiCode terminal id — and the daemon resolves a terminal's own grant (browser.policy.term:<id>) beside the existing per-agent key. A caller with neither stays read-only on the tab on screen.
  • The shell tray reaches disk parity. The tray now shows the disk line (WSL … · ≈… held · C: … free, with the low warning), a Give-back item with the readiness interlock, an explicit stop-the-distro confirmation and a measured result, plus Restart PiCode and View logs — every duty the Go tray menu owned. One board composes status, disk and tooltip so no timer erases another's write; the keepalive re-arms itself after a compact.
  • Antigravity launch is editable. Same honest shape as Muse Code in the previous slice: real defaults editor, profiles, the Customize checkbox and the row menu's Launch settings. No hook surface in its build either, so Activity reporting stays off with the one-line note and integration: true is refused.
  • ****: terminal agents are principals in the browser permissions — the identity tuple (managed agent → terminal → unmanaged), the term:<id> grant key and the decision table behind it.
  • The shell is becoming the only Windows resident. picode-shell.exe now holds the WSL distro open with a supervised keepalive, polls daemon health every 5 seconds, and reports it in a tray status line and tooltip — the duties the Go tray owned. --hidden starts the resident with no window (the logon-task mode); a second launch brings the window up. picode-desktop startup-repair --retarget-shell moves the PiCodeDesktop task to the shell, refusing foreign tasks and missing executables; plain repair now accepts either resident.
  • Muse Code launch is editable. Its Launch tab has the real defaults editor (executable, arguments, PATH, environment), profiles, the Customize checkbox and the row menu's Launch settings — the gaps in the terminal ··· menu are closed for Muse. Sessions and resume are unchanged.
  • JavaScript (Settings ▸ Browser ▸ Browser permissions): sites may use JavaScript — on by default, applied to every open tab at once and to the ones created later, through the platform's own setting.
  • : the shell becomes the only Windows resident. The Go systray (picode-desktop.exe --tray) retires; picode-shell.exe takes autostart, the WSL keepalive, health/disk polling and the single tray icon, while the Go binary stays as the headless CLI tool the shell drives. Window close hides, tray Quit exits. Migration runbook in docs/plans/retire-go-tray.md.
  • Site settings (Settings ▸ Browser ▸ Browser permissions): one dialog with the six kinds that matter — camera, microphone, location, notifications, clipboard, autoplay — each set to Allow, Block or the platform's own default, applied to every site through the shell's policy, plus Recent decisions: every standing the browser recorded, with the site, the kind and a Reset. Until the Ask prompt lands, a kind with no choice follows the platform's default (deny), which the dialog says plainly.
  • Site permissions, the shell half (Settings ▸ Browser): every tab now answers permission requests — camera, microphone, location, notifications, clipboard, autoplay, sensors, MIDI, fonts, file system — from the policy the user set (btab_set_permission_policy), and reports each outcome as btat://permission. The app records the standing through the daemon's API, so the Site settings dialog has real data to list and edit.
  • Site permissions, the data half (Settings ▸ Browser): the daemon now keeps one standing per site and kind — camera, microphone, location, notifications, clipboard, autoplay, sensors, MIDI, fonts, file system — with GET/POST /api/browser/permissions, DELETE /api/browser/permissions/{id} and POST /api/browser/permissions/clear (optionally one kind), all tested, on migration 050 and the events invariant. The shell feeds it and the Site settings dialog reads it in the next slice.
  • Muse Code and Antigravity sessions can be continued elsewhere. Both are now handoff sources: Continue in… appears on their session rows, offering every CLI that can receive the conversation. Muse reads through its own export --session (official transcript); Antigravity reads the CLI's per-conversation transcript, deliberately not the SQLite protobuf (unversioned field numbers). Reasoning never travels; oversized sessions fall back to the brief, which both already support.
  • Muse Code and Antigravity can receive a brief handoff. Continue in… (on a session row, a terminal row, or the pane menu) now lists them as destinations: the conversation travels as an opening brief — muse "<brief>" starts the session with it, agy --prompt-interactive "<brief>" does the same. They are the first prompt-only targets (no native session import yet), so brief is the only mode offered until their writers land.
  • Downloads (Settings ▸ Browser): Location shows where the built-in browser saves files (the system Downloads folder until changed), with a Change dialog; "Ask where to save downloads" decides between a save prompt and writing straight to the folder; Download history lists every file with its size, time and outcome, searchable, with Open file / Show in folder / Copy path / Remove per row and a two-step Clear all.
  • The shell reports each download (start and outcome) through btab://download; the list lives in the daemon store (GET/POST /api/browser/downloads, POST /api/browser/downloads/status, DELETE /api/browser/downloads/{id}, POST /api/browser/downloads/clear).
  • Every Agent CLI now shows the same tabs. Launch, Terminals, Sessions, Providers, Settings, Keyboard, Packages and Connectors appear for all of them, so the pane has one shape instead of three. The tabs a CLI has no native editor for — today all of them except Pi — say "… for <CLI> are in development — coming soon" instead of pointing at Pi, and a deep link on a phone scrolls its own tab into view.
  • The tmux app shows the machine's tmux servers. A new Sockets tab lists every tmux server this instance can see — the default socket, every named one, and PiCode's own dedicated socket — with what each holds: N session(s), how many are PiCode's, and whether anything is listening (a socket file with no server is labelled as the leftover it is). The tab badge counts the running servers, and the row for PiCode's own socket says where new terminals will land.
  • Custom provider form: per-model display name, input (text, image) and cost (USD per 1M tokens, all four rates or none), a streaming usage compat flag, and a provider string per thinking level (xhigh → high), so a gateway like meta-ai is fully describable in the GUI — no hand-edited models.json. Clearing a row field removes the stored key; Edit prefills everything the file holds. The API key flow is unchanged: a literal credential into auth.json, exactly as cheaperinference.
  • Servers in the inspector rail: what is listening on this machine, who owns it (the PiCode terminal or agent whose process holds the port) and what the page calls itself, with one Open that shows it in PiCode's own browser tab.
  • A loopback URL printed in a terminal (Ctrl+click, or the pane menu's Open …) opens in PiCode's own browser instead of the system browser — unless Browser settings says local development sites should open externally, in which case nothing changes.
  • Without the desktop app, that browser tab renders a page from this machine in a frame, with one line saying so, and its address survives a reload.
  • POST /api/browser/history/delete removes a selection of visits in one transaction.
  • PiCode terminals get their own tmux server. Each instance runs tmux on a socket inside its data directory (~/.picode/tmux.sock for the main install), separate from your personal tmux: a kill-server on one side can no longer take the other down, and scratch/QA instances stop creating their sessions in your tmux. Attach from your own shell with tmux -S ~/.picode/tmux.sock attach -t picode-…; inside a PiCode terminal everything works as before.
  • Terminals created before the change keep running: the daemon follows both servers while they drain, and the terminal list, status and tmux app show one fleet. They move to the new server when they are restarted or recreated.
  • The tmux guard has a switch. Preferences ▸ Terminal (Terminal defaults) gains a Safety section: the tmux guard shows its state and toggles between *On* (refuses kill-server, pattern kills and other terminals' sessions inside PiCode terminals) and *Off*. The line says the change applies to terminals opened from now on, links to how it works, and keeps the switch honest under failure — a failed refresh says so and offers Try again, a failed toggle reverts and reports.
  • The wiring status now installs the guard on first read, so a fresh instance reports the default-on state instead of "off" until its first terminal.
  • Antigravity sessions. The Antigravity pane has a Sessions tab like Muse Code and the adapter CLIs: every conversation Google's CLI keeps on this machine, with its folder, age, size and turn count, grouped by folder and filtered to the workspace you are in. Open in terminal resumes that conversation (agy --conversation <id>) in its own folder. Read-only.
  • Sessions for a CLI whose history exists before it has an adapter: the pane shows the tab whenever the server reports a session source, instead of only for CLIs with activity reporting.
  • tmux server loss is now recorded while it happens. A daemon-side watch probes the tmux server every 15 seconds: a server that dies with sessions running gets a terminal.server_lost entry (last known session count, socket and when it was last seen) in the feed and a line in the daemon log; its recovery gets terminal.server_back, and a running server whose session count drops by five or more between probes leaves a log line. Until now a lost fleet was only reconstructed on the next daemon start.
  • tmux guard. PiCode terminals now run a tmux wrapper that refuses server-wide kills (kill-server, kill-window, kill-pane), pattern kills, and kills of sessions another terminal or the user created. It allows exact kills of sessions your terminal created and stamps sessions you launch with your terminal's mark, so cleanup stays possible. On by default; every refusal is explained on the pane and logged to <dataDir>/tmux-guard.log.
  • Clear browsing data (Settings ▸ Browser ▸ Browsing history): one two-step button clears cookies, site storage, cache, service workers, download history and WebView2's browsing history from the shared work profile — saved passwords and autofill are deliberately untouched (the Autofill switches own those). Our own history list clears with it.
  • Muse Code sessions. The Muse Code pane has a Sessions tab: every conversation the CLI has on this machine, with its folder, model, age and size, filtered to the workspace you are in. Open in terminal resumes that exact conversation (muse --resume <id>) in its own folder. Read-only — PiCode lists and resumes, it never rewrites Muse's session store.
  • Sessions for a CLI whose history exists before it has an adapter: the pane now shows the tab whenever the server reports a session source, instead of only for CLIs with activity reporting.
  • Autofill and passwords (Settings ▸ Browser): Password manager and Contact info switches push straight into the work profile — every webview applies them at creation and live on change.
  • Open destinations (Settings ▸ Browser): web links and popups, and local development sites, each open in PiCode (adopted as tabs) or in the system default browser. The work browser's shell hands external destinations over with a scheme-checked btab_open_external.
  • Show full URL (Settings ▸ Browser ▸ Address bar): on — the address bar keeps the path, query and fragment (today's behavior); off — site origin only. Saved per machine, live on every open tab.
  • HTML previews run on their own address (<ticket>.localhost), so a page can keep settings, register a worker and use its own storage — and neither Save nor Reload resets it.
  • When the browser cannot open that address, or when PiCode is reached from another machine, the preview falls back to the sandboxed frame with one line above it saying so.
  • Browsing history (slice 3, first half): the work browser records one visit per navigation — a URL re-reported updates the newest row in place instead of piling up (typed flag sticks once set). Settings ▸ Browser gains a Browsing history section: newest-first list, per-row Remove, and a two-step Clear history. The address-bar dropdown reading this store is the next increment.
  • Muse Code and Antigravity in Agent CLIs. The catalog lists Meta's muse and Google's agy: installed or not, Check setup, New terminal, which runs the CLI in a PiCode terminal with its own defaults, and Check for updates in the same ⋯ menu every other CLI uses — Muse Code against its release channel, Antigravity against the vendor's release manifest. There are no launch settings, no session list and no activity state for these two yet. Both wear their vendor's mark (Meta, Antigravity) wherever the CLI appears.
  • HTML previews render unsaved editor changes too: the pane hands the buffer to the preview, and saving the file returns it to disk.
  • The grants editor lives in Settings ▸ Browser: one row per managed agent with its effective access — Read (the tab on screen), Act or Full plus the hosts it may reach. Pasted entries are forgiven (scheme, path and port stripped); the change saves per row and is live for the agent's next command. Slice 4 of the desktop browser plan is complete.
  • HTML previews reload themselves: editing the page or any file it loaded on disk refreshes the frame (served-asset watch over SSE), and a page too large for the text editor still previews from disk.
  • HTML files preview as real pages — scripts run, styles and images load from their folder — in a sandbox that never reaches PiCode's session, with Reload and Open in browser.
  • The shell enforces the browser grant at navigation time: once an act-tier command drives a tab, agent-caused loads outside the agent's domains — script redirects included, not just the navigate verb the daemon pre-checks — are cancelled. User-initiated navigation is untouched; navigating the pane from its own toolbar disarms the gate until the agent acts again.
  • A public Changelog on the docs site. Newest first, including what is still Unreleased. Not a blog — the same Keep a Changelog file, readable next to the guides.
  • An MCP cookbook. The MCP page is the index. Gmail and DeepWiki each have their own page: install, sign-in if any, and how to revoke.
  • A Configure overview. Which screen edits which file, the one workflow that does not mix Preferences with pi Settings, and a worked example for a custom endpoint.
  • Agent browser split: a terminal that hosts an agent — the agent's TUI or a CLI launch — can open the work browser beside it (right-click → Open browser), bound to that agent so the browser Pi tool acts on the pane on screen. The split resizes (drag), maximizes, and closes from the pane's own controls.
  • The split survives a relaunch: the layout (which tabs host a pane, the dragged width, the maximized flag) and each pane's last url persist in localStorage. After the desktop app restarts, the panes come back at the pages they were on — the first time a host tab is shown, its webview is recreated where the pane is. Panes whose agent or terminal is gone are pruned on boot instead of reopening to nowhere.
  • Archiving and deleting snippets now work on the phone. A snippet's page has Archive / Unarchive and Delete (with a confirm naming the snippet), and the list has an Archived view next to Active — so an archived snippet is visible and can come back instead of disappearing with no handle on the other side.
  • The Snippets guide now covers the whole editor: what the slug line means while you type (free, or in use with Save off), the placeholder table (default, optional, and the choices list that becomes a dropdown when you send), where snippets come from (starters, saving a selection, importing a prompt, duplicating), and that a half-written snippet no longer dies with the tab.
  • The phone's snippet editor does what the desk's does. The placeholder table is there — default, optional, and the list of offered choices per {{name}}, with a reserved name ({{branch}}, {{cwd}}…) saying where it comes from instead of pretending you can set it. Broken {{placeholders}} are named under the body while you type, Save waits until they are fixed, and an address already in use is a line under the Slug field rather than a refusal after the tap. Choices you add keep working when the snippet runs: a value outside the list is refused.
  • Custom endpoints: the base-URL field now explains itself. A hint and an example follow the API type you pick — an OpenAI-style root usually ends in /v1, Google's in /v1beta, and Anthropic-compatible endpoints differ — so the field stops being guesswork.
  • More thinking formats, including the two that need an object. The format picker now offers what pi actually supports: openai (the old reasoning_effort name was written back as openai), deepseek, qwen, qwen-chat-template, openrouter, together, zai, ant-ling, string-thinking, plus chat-template and baseten, which reveal a JSON editor for chat_template_kwargs / chat_template_args with pi's $var references. A typo is explained inline instead of being saved.
  • Verify a custom endpoint for real. The row's Verify with the endpoint (1 request) sends one minimal completion (one word in, the smallest output ceiling the API accepts) and reports what the endpoint said — the model, how long it took and the tokens it counted. The dialog can do the same before saving. Built-in providers keep pi's free answer.
  • The snippet editor tells you when an address is already taken — while you type, not after the save: the line under the Slug field says which snippet holds /snip:…, and Save stays off until you pick another one. On an existing snippet its own address is never reported as a clash.
  • Docs: browser tools for pi — a new guide explains what an agent can read in the work browser, what a grant adds (act: evaluate, navigate), and who may call it: a managed agent has its own grant, a plain pi TUI reads the tab on screen.
  • The dashboard now says what is waiting on you. One line above the numbers — “3 need you · 2 questions in Inbox · 1 terminal waiting” — with a single action that goes to the Inbox, or to the waiting terminal when the Inbox is empty. It appears only while something is blocked.
  • Sidebar Apps tab: an APPS header and a live "Search apps" filter (Escape clears), with tiles sorted alphabetically — same pattern as the Pins tab.
  • Custom endpoints: load the model list instead of copying it. The Add/Edit endpoint dialog has a Load models button under the ids: it asks the endpoint what it serves and adds the ids you are missing (your typed ones stay, nothing is reordered). It also fills context window and max output when every listed model reports the same number, and says so when they differ. It works for OpenAI-compatible gateways, Anthropic and Google endpoints.
  • The failure says what to fix. A refused key, a URL that needs /v1, a host that does not resolve, or an account that cannot list: each is one line naming the next step, in both apps and in the same words.
  • The tmux app: every session on your tmux server, in one screen. PiCode runs every terminal and interactive agent in tmux on your own server, and until now a session with no terminal or agent behind it was invisible in the product — you had to leave PiCode and run tmux ls to find it. Apps → tmux (on the phone, More → Apps) now shows the whole server: PiCode's sessions (with Open), sessions no longer in PiCode's records, and your own tmux sessions beside them, marked as not PiCode's and left alone. A row expands to the folder, command, uptime and attached clients; the Server tab carries the version, socket, client count and keyboard mode, plus the terminals whose sessions are gone (including the ones the flight recorder saw die in a restart).
  • Removing a leftover asks, and re-reads the session before it acts. A session PiCode cannot attribute can be removed one row at a time, behind a confirmation and a receipt (session id, start time and pane process): if the session changed since the page was drawn, nothing happens. There is no bulk cleanup, because a session missing from PiCode's records may belong to another PiCode on the same machine — the row says so instead of guessing, and every removal is recorded as an audit event.
  • A grant can let an agent act. With the act tier, two verbs join the browser tool: evaluate (run an expression in the page) and navigate (go to a URL). Without a grant both are refused by name, with the way to grant them.
  • Agents can read the page open in the work browser. A new browser tool (snapshot, screenshot, events) reads the tab on screen in the desktop app and answers with its structure, a PNG path, or what the tab recorded.
  • Custom endpoints: pick how thinking travels on the wire. The Advanced section of the Add/Edit endpoint dialog now names the thinking format — reasoning_effort (the OpenAI standard), DeepSeek, Qwen, OpenRouter, Together or Z.AI — instead of assuming every gateway speaks reasoning_effort. The choice is written as compat.thinkingFormat in ~/.pi/agent/models.json; leaving it at the default writes nothing, so pi keeps choosing for that API type.
  • Starters in the snippets studio. An empty page now offers six ready prompts — review a pull request, explain an error, write a commit message, summarize uncommitted changes, run the tests and fix failures, standup update — each opening in the editor with its placeholders, tags and address already filled in. Once you have snippets of your own the list collapses into one line you can reopen.
  • Duplicate, on a list row and in the snippet itself. A near-miss becomes a copy you can edit: title gets “copy”, the address gets -copy, and the original is untouched.
  • Snippets are easier to write. The studio editor now validates the body as you type — a broken {{placeholder}} shows a line naming the problem and Save says why it is off — and everything the grammar knows is editable from a table under the body: Default, Optional and Enum per placeholder, written back into the text. A Try it pane gives each placeholder a sample value (enums become a picker) and shows the expanded prompt, including what will be asked for at run time.
  • Save a prompt straight from the composer. Select text and a Save as snippet button appears in the message bar; the same action is in the right-click menu as Save selection as snippet, so any text you select — in the composer or anywhere in PiCode — can become a snippet without retyping it in the studio. On the phone it is Message options → Save as snippet.
  • Import a prompt from another tool. The snippets list gained Import: paste a prompt and PiCode finds its slots, offering [BRACKETS] and UPPER_CASE as {{placeholders}} — each suggestion can be switched off — then opens the editor with the result. Available on the phone too.
  • Custom endpoint form (Add provider → Custom endpoint): a Reasoning model switch with the thinking levels the model answers on (minimal…max). The selection is written as pi's per-model thinkingLevelMap, so the levels a gateway really supports show up in the model picker — max included — instead of stopping at high. Edit prefills the same levels from the file.
  • Work browser: the shell now speaks CDP itself. The desktop app carries a command bridge over the page host API, so a page's DevTools protocol is reachable without any open debug port. Read-tier page events (navigation, console, network, log) are recorded per tab for whoever polls them.
  • Continue in Pi now asks where it opens. Pi is both a CLI and the platform's managed agent, so its "Continue in…" entry has a second menu level — *Pi agent · in the app* (a stopped agent, no installed CLI needed) or *Pi CLI · in a terminal*. The dialog's new Where section lets you change the choice before continuing; a brief to the agent lands as its first queued prompt.
  • Files: switch workspace from the tree's toolbar. The folder line at the top of a Files tab is now the workspace that folder belongs to, opening as a picker of your other workspaces — every folder is offered, repositories or not, with the folder path as its second line and a check on the current one. Picking one re-points the tab: the same folder swaps the owner in place, another folder moves the tab to it (one tab per folder, as ever), and a pick that cannot resolve leaves the tree exactly as it was. A single workspace keeps the plain folder line.
  • Snippets. Save a reusable prompt or a shell command under Tools or the command palette (#/snippets). Placeholders use {{name}}. Type /snip: in an agent composer to insert or send one, pick Send snippet in the command palette, right-click a running Agent CLI terminal and choose Send to terminal…, or Run command… on a shell pane — the confirm always shows the exact command before it runs.
  • Mobile Git: switch workspace from the screen. The folder line at the top of a Git screen is now a control when there is more than one workspace to read through: it opens a sheet of your workspaces, each with the branch that folder is on and a check on the current one. Picking one opens the Git screen for that workspace, so Back returns where you were; folders that are not Git repositories are never offered, and a single workspace keeps the plain line.
  • Git graph: switch workspace from the toolbar. The graph's first item is no longer the repository's name but the workspace its history is read through — a dropdown of your other workspaces, each with the branch that folder is on. Picking one retargets the reading folder without leaving the tab: sibling worktrees of one repository swap in place (the HEAD dot and the this worktree row move), and a pick into another repository moves the tab to it, so one tab per repository still holds. Folders that are not repositories are never offered, and a pick that cannot resolve leaves the graph exactly as it was.
  • Providers: Custom endpoint in Add provider registers any OpenAI-compatible (or Anthropic-/Google-compatible) gateway for pi from the GUI — name, base URL, API key and model ids; no hand-editing ~/.pi/agent/models.json. Definitions merge into pi's own models file, the key is stored with every other sign-in, and the roster gains a custom badge with Edit endpoint / Sign out / Remove endpoint actions.
  • Continue a terminal's conversation in another CLI. The sidebar ⋯ menu, Agent CLIs → Terminals ⋯, and the pane's right-click menu offer Continue in… for the conversation that terminal is running. The existing preview dialog (what travels, what is left behind) opens; the original terminal stays put. A memory tool that injects a “where you left off” note in the same folder is a separate layer, not this action.
  • Text on the canvas. The toolbar has a Text element: draw a rectangle and a panel appears there ready to type in — a label beside a terminal, a note to whoever opens the canvas next. It saves as you pause and when you click away, and everyone looking at that canvas sees it. Two thousand characters; a pin is still what holds longer writing.
  • The zoom percentage is back, under the zoom buttons. It says where the camera is, and clicking it returns to 100 % — the only zoom at which a click inside a terminal lands on the character it points at.
  • Add an explicit, guarded “Activate now” action for open Agent CLI conversations that still need their first native event.
  • Git guard: main can no longer be rewound — the reference-transaction hook refuses any move of main that is not a fast-forward, including a stale-ref fast-forward onto a divergent tip that silently erased merged work once. A deliberate rollback requires PICODE_ALLOW_MAIN_REWIND=1. The guard's functional tests live in the hooks selftest.
  • Desktop shell: every window carries a dedicated app bar in the ChatGPT style — brand on the left, drag anywhere on the bar, double-click to maximize, and flat Windows caption buttons (close turns red) on the right. The bar belongs to the shell and works no matter which version of the web UI the daemon serves; the browser renders no bar.
  • Right-click the canvas. The plane has its own menu now — the same one the ⋯ button opens, with Show controls on top.
  • Show controls hides the canvas chrome. One switch takes away the zoom column, the toolbar and the minimap, so the plane is only the plane. The right-click menu still works with them gone, which is how you bring them back; the choice is remembered per browser.
  • Terminal attachments: sketch. The desktop attach bar and the phone sheet gain a Sketch button — an Excalidraw pad (the dependency, not the pin studio) whose drawing leaves the composer as a PNG. The chip reopens for editing until Send.
  • The Inspector follows the panel you are on in a canvas. Click a terminal or agent panel and the rail shows that one's files, changes and branch — until now a canvas left it on whatever it was showing before, or empty. Focusing a note, file or diff panel leaves the rail where it was.
  • Desktop shell: the tray item is now Management — a window with three views over the WSL distro. Disk shows what the distro holds and runs the Give back flow with live progress; Clean measures the prunable caches (picode clean --list) and prunes the selected ones — Pi sessions and the PiCode database are never cleanable; Config edits .wslconfig (memory, processors, swap, sparse disk) with an automatic backup, leaving unknown settings untouched; changes apply at the next full WSL restart.
  • picode clean — new subcommand that prunes the caches picode disk measures (--list to measure, --apply id1,id2 --yes to prune, --json for tools). Data directories are refused even when asked for by name.
  • Desktop shell: sharper taskbar/window icon (the icon file's largest image now comes first) and the shell's local pages use the product's design tokens.
  • Packages: Configure now works for descriptor-declared packages. pi-roles was the only package with a Configure button; any extension whose configuration is described (PiCode's catalog, or a picode.config manifest in the extension itself) now shows one, backed by a form that edits the package's own config file. Configurable today: pi-web-search (the model that backs native web search) and pi-compact (compaction policy — enabled, token/percent triggers, floor, cooldown, summarizer model, thinking and instructions). The files stay the packages' own source of truth: unknown keys survive saves, unset fields stay unset, and a broken file is reported and never silently replaced. No description for a package you installed? "Describe config…" lets you describe its configuration yourself — create, edit and delete the description at any time; PiCode stores it locally. Public docs (docs-site/guide/packages.md) now explain configuring and describing packages.
  • PiCode Desktop: give the held space back from the tray. When the disk file is holding space the distro freed, the tray offers Give back ≈92 GB…. It first asks PiCode whether anyone is working (the same interlock as a deploy — someone mid-turn is named, and it stops), then asks once in a dialog that names the cost, stops Ubuntu, converts the disk file to sparse, starts Ubuntu again and reports the before/after measured on the file. From then on WSL returns freed blocks on its own.
  • picode-desktop disk-compact — the same flow from a terminal. --dry-run prints the plan and stops nothing; --yes runs it; --force overrides the working check; --method optimize-vhd compacts with Hyper-V's Optimize-VHD from an administrator terminal (Windows Home: upgrade WSL for the sparse path instead).
  • PiCode Desktop: the tray now tells you what the disk is doing. One line under the status — WSL 218 GB · ≈92 GB held by Windows · C: 27 GB free — refreshed every five minutes, ending in — low under 20 GB free, with the tooltip carrying the same sentence and the command that shows the rest.
  • picode-desktop disk reports both halves of a WSL disk in one screen. The Windows side (the VHDX path from WSL's own registry, the file's real size, whether it is sparse, free space on the volume) and the distro side (filesystem, the caches with the exact command that gives each back, the top-level breakdown of home). It shows held for nothing: the space the distro has already freed that the disk file still occupies — invisible in Explorer, and the reason a full C: stays full. Read-only.
  • picode disk lists what occupies the machine and what is safe to reclaim, one line per item with safe, redownload or data, plus the paths it could not read named as such instead of folded into a category. --json feeds the tray and, later, the Storage app.
Melhorias · 125
  • The tmux watcher integration test and the kill-server test address a server they own with -S instead of rebinding the process-wide TMUX_TMPDIR: a test that ends a server can no longer strand other tests — or a background goroutine — in the same binary on the server it dismantles. The kill test keeps asserting the directory guard; the watcher test asserts the suite's namespace is untouched.
  • No Activity reporting for Muse Code, stated plainly. Its build offers no hook surface, so the toggle is replaced by a one-line note ("its terminals stay Open") and the server refuses integration: true with 400. The startup seed that switches Activity on for empty configs skips hookless CLIs.
  • The work-browser tab no longer spends a line telling you it is a frame: the page starts directly under the address bar.
  • The address bar's Open button fills the pill it shares with the field (its hover covered only a 28px strip) and uses the return glyph instead of a text ↵, which sat high in its box.
  • The setup tabs are placeholders until each CLI's editor exists; Pi keeps its real Providers, Settings, Keyboard, Packages and Connectors panes. No editor is implemented for another CLI before its launch settings match the others.
  • Autofill and passwords rows now open Manage dialogs instead of hiding the switches on the page: Password manager offers "Offer to save passwords" and a two-step delete of everything the profile stored; Contact info offers "Save and fill addresses" and the same delete for saved form data. Each dialog says plainly that saved entries live in this machine's browser profile and cannot be listed or edited per entry — WebView2 exposes the switches and a wipe by kind, nothing that reads entries back.
  • Browsing history now presents the data the way the reference does, inside the dialog: a search field, day groups that collapse (newest open, "Today"/"Yesterday" named), and a row per visit with its site icon, host, visit time and a per-row menu (Copy link, Remove from history). Rows can be selected and removed in one go, and "Clear browsing data" sits on the section header.
  • Scratch instances (QA scratch, docs fixture) and their cleanup operate on their own tmux server, so their sessions no longer appear in — or collide with — your tmux.
  • Custom endpoint is now Custom provider. Titles, buttons, menus, toasts and the Providers guide use the new name (matching); routes, API paths and behavior are unchanged.
  • Clear browsing data now opens a dialog in the reference shape: a time-range picker (hour / 24 hours / 7 days / 4 weeks / all time) over a checklist of what to clear — browsing history, cookies and site data, cached images and files, download history, autofill form data and site settings — each showing what it will remove.
  • Web: the editor tab strip (browser and desktop) now follows Chrome's CR23 tab language — raised active tab, hover pill, idle separators — instead of the rectangular accent-underline tabs. Overflow, keys and the all-tabs list are unchanged.
  • Header matches Chrome's tab strip: 41px tall with 35px tabs inset 6px from the top, 20px idle separators, 8px corner radius (docs/benchmarks/2026-09-15-chrome-tab-header.md).
  • The selected tab now reads connected to the page on /browser and /desktop: it shares the toolbar background and no hairline cuts it off, while the sidebar head, tab strip and inspector head read as one header bar with a single hairline between them and the content and no pane verticals crossing it.
  • Settings ▸ Browser follows the reference layout: a page title and lede, section headers, and cards of rows whose title and description sit left with the control pinned right, divided by hairlines. Switches are pills, selects and actions are outline buttons, and Browsing history opens in a dialog. The chrome around the page stays PiCode's.
  • The master Browser switch is real: off refuses every browser verb for every agent server-side until it is turned back on.
  • AGENTS.md: the scratch-tmux rule now names the measured mechanism — $TMUX outranks TMUX_TMPDIR (so a "isolated" client still talks to the server it was started in), -L overrides $TMUX, and TMUX_TMPDIR only counts when that directory exists.
  • Custom endpoint is a page, not a dialog. Add provider → Custom endpoint (and Edit endpoint) opens #/clis/pi/providers/custom with the form in Identity / Connection / Models sections, Name + API type side by side on wide screens, and Verify key beside the field it checks. The how-to prose moved to the Providers guide; the page carries a Setup guide link instead.
  • Muse Code and Antigravity keep the same launch screens as every other CLI. The New terminal screen shows the CLI row and the Launch preview (which command PiCode will run, what it adds), and the Launch tab shows the plan summary instead of a one-line notice. Nothing is editable for them yet — the customize checkbox and launch profiles stay absent — so the screen reads the same and says plainly that the CLI keeps its own defaults.
  • Agent CLIs describe what a row can do as capabilities: a CLI can open a terminal without carrying activity, launch settings or sessions.
  • Web: the active editor tab is the elevated surface (the white the sidebar reads as), so it no longer disappears into the strip gray.
  • A stopped CLI terminal now sits in a simulated terminal window. The state — what stopped it, the conversation Resume last session would reopen, and the two actions — is drawn inside a framed terminal window (titlebar, traffic lights, the terminal's own name and folder as the title), centered on the page and hugging its content instead of filling the pane. The page keeps the app's theme; the window is a picture of a terminal and is dark in both themes. Same on the phone.
  • A stopped CLI terminal is a real empty state, not a sentence in the corner. Its pane now shows a mark, what stopped it (a plain stop, a restart that ended it, or a failed last launch), the conversation Resume last session would reopen — CLI, name and age, with the opening words on hover — and the two actions. A terminal with nothing pinned says *no session to resume* instead of offering no button and no reason.
  • The empty terminal pane follows the app's theme (owner call): a light app no longer shows a black well where a terminal used to be — the ground is the app's own and the message reads in the app's inks, in both themes.
  • make desktop-restart swaps the v2 shell too: the target now builds picode-shell.exe (Tauri,) alongside the tray + native host, and scripts/desktop-swap.sh stops, copies and relaunches it when it was running. A stale shell refuses page commands with a Tauri ACL error — its capability list compiles into the exe (2026-09-14: btab_cdp_call refused for days after the CDP bridge landed). DRY_RUN=1 prints the plan and touches nothing.
  • Tools docs open with Where and Not this. Browser tools, Chrome extension, Docker, Integrations, tmux, CLI activity reporting and keyboard each say what the page is, where to click, and what it is not.
  • Inbox: "Clear all done" sits beside the filter on the Done tab, right-aligned on the toolbar row, instead of trailing the list — the same place every list page keeps its bulk action. Any app that declares a list-pane actions row gets this for free; an item's own actions and empty-state actions are untouched.
  • Chat and work docs open with Where and Not this. Canvas, session messages, Inbox tools, Checklist, Compact earlier and the diff panel each say what the page is, where to click, and what it is not.
  • Agents docs open with Where and Not this. Agent CLIs, Packages, MCP, llama.cpp, Automations and Snippets each say what the page is, where to click, and what it is not.
  • One right-click menu for every terminal pane (managed Pi in-terminal, Agent CLI, plain shell). Chat and the composer stay on the generic menu.
  • Send to terminal… on an in-terminal Pi pastes into the TUI (palette Send snippet too); the sheet says “Sent to the terminal.”
  • Attach files… / Ask Pi about this on an in-terminal Pi use /api/agents/{id}/drop and /prompt, not a terminal id.
  • Rename agent… / Remove agent… (existing cleanup confirm, never “This stops the tmux session.”). Terminal settings from an agent pane opens global Terminal defaults.
  • Continue in… on an in-terminal Pi uses that pane’s session file and asks to continue while the TUI is still writing.
  • Close browser split actually appears when the split is open.
  • Getting started installs from a GitHub release, not make build. Download the binary, run picode install, open the app. Building from source is a separate page.
  • Public docs sidebar is Start / Use / Run / Configure / Reference. The old flat Guides list is gone. Settings and Providers sit under Configure; a Use catalog lists every capability in one place.
  • A snippet Command no longer runs into a repository another agent is writing in. The confirm step still shows the exact command; running it is refused with a message naming who is at work there, the same rule the terminal's Run command… already followed.
  • Docker, Inbox and tmux now read like every other page. Their surfaces keep the app's tab strip, head actions and filter, but inside the same page frame a system route uses: a 1240px card, the view's tabs as an underline nav with count chips, the filter in the card toolbar, and the list and detail panes inside the card (side by side, stacking on narrow windows). Empty, blocked and error states are one line plus one action instead of a full-page poster.
  • The custom endpoint dialog reads field by field. Name, Base URL, API key and Model ids carry a label above the control and one line of help under it, with a clear gap between one field and the next — the placeholders were the only label before, so a filled field could not be told from an empty one. The helper prose that read as a lecture (a file path, a protocol note) is gone; what stayed says what the control does.
  • Limits belong to the model, not to the list. Context window and max output are one row per model id (Advanced → Model limits), so Load models fills each model's own numbers — a gateway whose models disagree is no longer refused with a blank field and an explanation. A number typed by hand survives a load; a row follows its id into and out of the list.
  • Advanced is a section, not a wall. The disclosure holds grouped sections — Request compatibility, Thinking, Model limits — each with a legend and a hairline, so it reads as structure once open and stays one line while closed.
  • Load models and Verify key report inside Model ids, the field that owns them, so a refusal line ("The endpoint refused the key (401): invalid api key provided. Check the API key and try again.") sits next to the action that caused it and never pushes the alternative route below the fold.
  • Half-written snippets no longer die with the tab. Drafts moved from the per-tab shelf to the browser's durable one, so closing the tab or reloading brings the text back (a capture or an import is still handed over as a new snippet rather than announced as "unsaved changes").
  • The Fleet tile counts agent CLI terminals, not just managed agents. The sidebar's Claude Code, Codex, Grok, Hermes and OpenCode terminals were invisible to the dashboard, which could read 1 / 1 running beside seven live terminals. The tile now shows N live (agents + agent CLIs), states working / need you / idle / no signal, names each one, opens its tab on click, and counts plain shells apart — no signal means a CLI is running but has not reported activity, never that it is idle.
  • The handoff board is an index now, not a ledger. Next steps still render inline (they are bounded and they are what a session acts on), but debts are one line per topic — the count, the topic file and its plan. Rendering every debt made the board grow with the backlog, which is what filled it; it is about half the size and no longer trips its budget on one honest entry. make handoff now fails, naming the file, when a topic file lists bullets outside its ## Next / ## Debts headings — six snippet debts were invisible that way for a day.
  • Six snippet debts were invisible on the handoff board. The board renders the bullets under a topic file's ## Next / ## Debts headings, and docs/handoff/open/snippets.md had neither — so its debts never reached the sessions that read the board. It has the heading now, consolidated to the three that carry the meaning; the roadmap lives in the plan.
  • Also pruned there and elsewhere: bullets that only restated a plan file, a debt already carried by its owning topic, and the 0.2.0 release step (cut; tag v0.2.0 exists).
  • Continue dialog uses the width of the screen. How and How much sit as two columns; the brief preview is wider and taller instead of a 520 px column in the middle of the pane.
  • Web: the dashboard no longer offers a folder-scope filter — the "This machine | PiCode" chips are gone and GET /api/sessions/stats measures the whole machine only. Spend by workspace keeps ranking every folder, naming claimed workspaces and leaving the rest as their own folder; the payload's scope field and the ?scope= parameter are removed.
  • Web: the inspector panel no longer carries its own hide button — closing it stays with the single toggle at the end of the editor tab strip (browser and desktop).
  • An empty canvas is empty. The card explaining what a panel is no longer floats in the middle of a new canvas — the plane, its texture and the toolbar are the whole page.
  • The canvas switcher is as wide as the canvas's name. It kept a fixed minimum width, which left a gap after a short name.
  • Panels are added from the canvas toolbar and nowhere else. The Add panel… row left the ⋯ menu, and the empty canvas no longer carries its own button — pick an element below, then draw where it goes.
  • Surface split (routes): the responsive web app previously served at /desktop/ now lives at /browser/, and /desktop/ serves the new bundle composed for the Windows shell only (its entry wraps the app with the shell chrome; the browser never loads it). The Management page moved into that bundle — its design tokens are imported from the shared package, ending the hand-copied token block. The launcher and the docs screenshot machinery follow the new routes..
  • You choose where a panel goes. Add panel has left the toolbar. In its place, at the bottom of the canvas, there is one button per thing a canvas holds — agent, terminal, pin. Press one, draw the rectangle where you want it, and pick which agent or terminal goes there. The panel is created exactly in the rectangle, at the size you drew. Esc, or pressing the button again, cancels.
  • A new panel no longer appears off screen. It used to be placed from the canvas origin outward, which is nowhere near what you are looking at once you have panned.
  • The canvas switcher and the ⋯ menu moved to the top-left corner. The bottom edge is now for the hands: what you add in the middle, zoom and Fit on the left, the minimap on the right.
  • Files and changes are added from ⋯ → Add panel… — they are opened from a tab rather than drawn on the plane.
  • The keyboard map is a pane of its own. It was a *Keys* sub-tab under the Settings pane, which put two tab rows inside one view; it is now Keyboard, sitting between Settings and Packages in the Agent CLIs pane bar (#/clis/pi/keyboard). The Settings pane no longer has a sub-tab row, and the link keeps the agent and layer you came from, so going back lands where you left. A ?tab=keys bookmark still opens it.
  • The sketch controls sit where a thumb is. On the phone the tool row now sits at the bottom of the drawing with the colour/undo row above it, and the library/lock/hand column no longer crowds the pad; the pen is active on open, so drawing starts with the first touch.
  • Go tests are cached across worktrees. scripts/go-test.sh builds with -trimpath, so the test cache no longer depends on the tree's absolute path: a package tested once is reused in every worktree and terminal (measured 10.4 s per package before, (cached) after). Sessions that touch several packages get those minutes back on every iteration.
  • make ci keeps its full output in var/ci-last.log and says so when it fails. One full-matrix run failed unreproducibly with nothing but a bare FAIL left in the transcript; retries would hide that, evidence does not.
  • The contributor docs point at the generated board: CONTRIBUTING.md, the uiux-review/visual-review skills and the affected plans now send a durable next-up or debt to docs/handoff/open/<topic>.md instead of telling the reader to edit docs/handoff.md, which make handoff renders.
  • Opening a sketch on the phone starts with the pen: draw immediately instead of tapping the pencil in the toolbar first.
  • The project board is generated. docs/handoff.md is no longer a file every session edits (it was the repository's most-written file: 406 commits in ten days, 99.8% of its size cap, net losing text). make handoff renders it — what is in flight from git, next up and debts from docs/handoff/open/<topic>.md and the session notes — and it is not committed. Contributors with an old clone see it disappear from git status; that is the change.
  • make worktree-status shows what is actually open: each worktree's branch, commits ahead/behind main, dirty files, last commit and last green gate — and flags a tree that has stopped producing commits.
  • make close reuses the green scoped run when a catch-up merge brought unrelated work, instead of re-testing a tree whose tested content did not change; it prints which of the two cases applied and why.
  • docs-site/public/llms.txt is generated by the docs build and the deploy instead of being committed; make docs still writes it.
  • make dev, make ci-scoped and make close print the worktree and branch they are running in.
  • The floating-controls experiment and the frame handshake were replaced by the dedicated bar.
  • The canvas controls stand in three places. Zoom and Fit are a column at the bottom-left, the canvas switcher and Add panel are centred, and the minimap keeps the right corner. The zoom percentage is gone from the row.
  • The canvas switcher is a PiCode menu, not the browser's. It used to be a native dropdown, which opened an operating-system list over the plane in colours nothing else in the app uses.
  • The terminal message field is a textarea that grows. One line tall at rest, four lines maximum, then it scrolls. Enter sends on the desktop and Shift+Enter breaks the line; on a phone Enter breaks the line (no Shift on a soft keyboard) and Send or Ctrl/⌘+Enter submits.
  • Agent CLIs → Settings edits one layer at a time. A labelled switcher (Edit: This machine / workspace / agent) picks the layer, the line under it names the file that layer writes, and the body shows only that layer's rows — instead of stacking the same six knobs for the machine and the workspace and hiding the agent's below them. The chosen layer and the tab travel on the URL (?layer=…&tab=…), so a reload or a bookmark lands on the same view; an agent link opens that agent's layer.
  • Rows say where their value comes from: Set here (with an accent bar) when this layer sets it, Pi default or From This machine when it inherits. A row this layer sets offers Use inherited, which hands the value back to the layer below instead of freezing a copy of it.
  • Keys is a sub-tab of its own: the whole 89-row keyboard map keeps its filter and its Add-then-press-a-key flow, without sitting at the end of the settings scroll. The global settings pane went from ~6000 px of scroll to under 1000 px.
  • The Canvas toolbar is one button group. The canvas and the camera were two groups with a gap; they are now a single row — the canvas switcher, Add panel, the zoom controls, and the ⋯ menu last. Add panel is no longer filled in the accent colour, and Fit wears React Flow's own four-corner glyph instead of diagonal arrows.
  • The canvas switcher is always a dropdown, with the app's icon. With a single canvas it had become a plain label; it is a menu again, so the canvases you could have are visible from the one you are on.
  • picode-desktop gained a clean subcommand that passes picode clean through to the distro, streaming its progress.
  • The Canvas chrome is now one toolbar on the bottom edge. The canvas switcher, Add panel and the ⋯ menu left the top-left corner and joined the zoom controls in a single dock centred at the bottom, as two button groups: the canvas and its actions, then the camera. Add panel is the filled button there. The minimap keeps the bottom-right corner, and the top of the plane is now empty — nothing floats where you start reading. On a narrow pane the minimap steps aside so the two never overlap.
  • Agent CLIs → Connectors is a roster, not a catalog grid. The pane opens with one primary action (Add connector), then the configured services: each row carries its state, the layer it lives in (title: the config file), the target, a switch and an overflow menu (Sign out, Remove, whose confirmation names the file). The catalog, the file picker and the target pills left the pane and became one dialog with a search field, a labelled Save to control, and two quiet secondary entries (*Custom server…*, *Import a file…*).
  • The redundant workspace line under the Connectors tab bar is gone (it repeated the scope already shown per row), and every control in the pane is the 36 px control height instead of a 28 px pill beside a 36 px button.
  • Live status is only claimed while an agent runs: with the agent stopped the pane says so once, instead of showing Idle on every row. A server that needs a login shows Sign in on its row even with the agent stopped.
  • The install target is part of the route (?scope=), so it survives a reload, and it is stated where the write happens instead of above the list.
  • The Canvas camera controls moved to the bottom-left, as a column. Zoom in, zoom out, the 100 % readout and Fit now stand at the far end of the bottom edge, with the minimap opposite them on the right instead of stacked above. Fit is an icon there; its keyboard shortcut (0) is unchanged.
  • A Canvas panel resizes from its bottom edge, its right edge and the corner between them. The other five targets are gone: dragging one of them moved the panel's top-left corner while it resized, so the panel slid away from under the pointer.
  • Agent CLIs → Packages: the install target sits with the action it modifies. The "This machine / workspace / agent" radios left the row they had under the source input — where they read as if they belonged to the Installed list below — and now sit in the install bar, labelled Install to, immediately before Install. Every control in that bar shares the 36 px control height, and the bar wraps as a unit (source, then target plus Install) when the pane is narrow.
  • The redundant workspace line under the Packages tab bar is gone: it repeated the workspace the target pill already names, and it sat hard against the tab rule. The pane owns a 12 px gap under the tabs instead, on Packages and on the pi-roles settings sub-page alike.
  • Fullscreen hides PiCode, and leaves your browser window alone. Turning it on no longer takes the browser fullscreen with it: your other tabs and your address bar stay where they are, and the mode is exactly what it says — the sidebar, the tab strip and the Inspector step aside, the edges bring them back, Esc closes an open panel and leaves on the next press. F11 still works and now stacks on top of the mode, in either order.
  • The canvas switcher is a name until there is something to switch to. With one canvas the top-left control opened a list holding the canvas you were already on. It is now simply that canvas's name; the moment a second canvas exists it becomes a picker again. New canvas is in the ⋯ menu either way, and the controls do not shift when the second one appears.
  • An empty canvas now offers its next step in the middle of the plane — one line saying what a panel is, and Add panel — instead of a blank plane with the controls in the corner. The plane, its background and the minimap stay where they are, and the line goes the instant the first panel lands.
  • The plane no longer shows the React Flow credit. The drawing library behind the canvas is MIT-licensed and unchanged; only its badge is hidden.
  • What's New opens on a fresh install too. A released build used to wait until you had made a workspace, an agent or a terminal, which meant a brand new install saw nothing and looked broken. It now opens once on the first load, still closes for good when you dismiss it, and still waits while a dialog, a reconnect, a waiting agent, an Inbox item or a create/share flow needs you first.
  • Agent CLIs strip is CLIs | Messages. Settings, Packages and Connectors (MCP) are panes of the selected CLI, next to Launch / Terminals / Sessions / Providers. Webhooks stay a PiCode page. Old Settings, Packages, Integrations connectors and #/mcps addresses rewrite.
  • Providers pane dropped the “This machine” lecture; empty llama.cpp is one line plus Set up.
  • A Canvas panel's edges and corners are now something you can actually grab. Every resize target is the same size to the hand however far in or out the plane is zoomed — a 20-pixel square at each corner, a 12-pixel band along each edge — instead of shrinking with the camera until there was nothing left to aim at. What you *see* is the grid's old language back: a short bar at the middle of each edge and a corner mark, appearing when you hover, focus or select the panel.
  • The line between two linked panels is a curve, and the line you drag while making the link is the same curve you end up with. Two panels sitting in the same row still join with a straight segment — that is what a symmetric curve between two aligned points is.
  • A link is easier to hit when zoomed out. The invisible band along the line no longer thins with the camera.
  • The Canvas background texture can be seen. Dots, Grid and Cross were drawn in the colour of a hairline — on the light theme the grid was at 1.16:1 against the plane, which is to say invisible. All three now use a colour chosen for a texture, and the dot is two pixels rather than one. The spacing is unchanged, so nothing on a canvas moves.
  • A stopped agent's panel offers Run as the accented button the agent tab uses for the same thing, instead of a grey chip that read as disabled. The same rule now runs through every panel placeholder: the action that *starts work* is accented, the action that only opens a tab or drops a dead binding is not.
  • The Canvas background is now chosen on the canvas. ⋯ → Background opens a submenu with Plain, Dots, Grid and Cross, each showing a real sample of its texture and a tick on the one you are using. The rows stay open while you pick, so the plane behind the menu is the preview. Your choice is the same one you had — it is still remembered per browser, and nothing on a canvas moves when the texture changes.
  • Preferences → Appearance is PiCode's own chrome again: the theme, and nothing else. The Canvas background group has left it, and so has the ⋯ menu's old Background… item, which existed only to send you there. An app's settings now live in the app — a project rule from today, not just a tidy-up.
  • Messages' list of hand-drawn links reads as Messages', because that is whose it is: it is now Granted contacts — the pairs you allowed to message each other by drawing a link between two panels on a canvas. Same rows, same Remove, same guarantee that a link never lets one session read another's history.
  • A failed compact no longer leaves the machine without its distro. The restart after wsl --terminate runs even when the conversion fails, and the tray re-arms the keepalive child the terminate killed — without it, WSL idles out sixty seconds after a compact.
  • Agent CLIs opens from the last icon in the desktop sidebar header (stacked boxes — the catalog of CLIs), not from the user menu Tools list. Clicking it does not switch a rail tab. Package-update marks move to that icon. Ctrl+K and mobile More are unchanged.
  • Launch Customize sits on the Launch pane heading again, not on the Launch / Terminals / Sessions / Providers tab row.
  • A CLI's page hosts Launch, Terminals, Sessions and Providers as inner tabs. The catalog is the CLI picker. Pi shows the account roster; other CLIs explain that Providers is unavailable and offer Open Pi. #/clis/<cli>/providers is the list; #/clis/<cli>/providers/new opens Add provider. Old #/clis/providers*, #/providers* and #/more/providers* rewrite onto those addresses. OAuth still returns to the list in the same app.
  • A VHDX that is not sparse is named in the report as the reason WSL cannot give freed blocks back, with the one command that changes it — it is not run, because converting or compacting the file stops the distro and its sessions.
  • Fullscreen: the exit control is a button again, not a sentence. The label and the chord moved into its hint (Leave fullscreen (Ctrl+Shift+Enter)), and the glyph now sits in the same 28px square as the Inspector toggle beside it.
  • What's new is a two-column board on a desktop. The release dialog takes 880 px instead of 400 and lays the highlights out in two columns, so a whole release fits one screen: the nine highlights of v0.2.0 are read without scrolling, and a summary stops wrapping at ~40 characters. The dialog also centres itself at any window height — a short window scrolls inside the dialog instead of pushing it against the top of the screen.
  • A CLI's page hosts Launch, Terminals and Sessions as inner tabs. The catalog is the CLI picker; switching CLI keeps the pane. #/clis/<cli>/sessions lists every folder; #/clis/<cli>/sessions/<id> lists one. Old #/clis/sessions*, ?cli= and #/sessions* links rewrite onto those addresses. Dashboard top-session rows open that CLI's pane.
  • The Canvas has no bar across the top any more. The plane runs from edge to edge and the controls float on it: which canvas, Add panel and a ⋯ menu sit in one small cluster top-left, the zoom controls and the minimap stay bottom-right. The bar's icon and title were the tab's own words, and its Close was the tab's ×.
  • New canvas, Tidy panels, Rename, Delete canvas and Close tab moved into that ⋯ menu. Everything the bar carried is still one press away, by mouse or by keyboard — Tab reaches both clusters before it reaches the panels.
  • Fit now leaves the controls their corners, so opening a canvas no longer parks a panel's header under them.
  • Maximizing a panel hides the floating controls while it is up: they belong to the plane, and the plane is what the panel covers. Esc brings both back.
  • The Canvas plane's background is yours to pick. Preferences → Appearance now offers Plain, Dots (what it drew before), Grid and Cross, each card showing the pattern rather than naming it. The choice is remembered per browser and applies the moment you make it, to every canvas already open. It follows the theme's colours, so switching between light and dark re-tints the ground without a reload.
  • Light mode is no longer pure white. The page was white and the panels on it were grey, which is upside down: nothing lifted, and the app read as one flat sheet. The page is now a soft, slightly cool grey and the surfaces above it are near-white, with dialogs and menus in white above those. Text sits at 15.9:1 on the page and 17.3:1 on a panel, and links and primary buttons went one step darker to clear the readability bar they were under.
  • Providers: one row per account, columns that line up. The roster is a dense table now — provider, account, identity, usage, 7-day spend and the actions sit in fixed columns instead of being pushed to the two edges of the card. The quota reading moved into its own column, so two accounts' bars can be compared without reading a label, and a long vendor reason ("Rate limited.") stays on one line instead of wrapping under the buttons. Ten providers plus the llama.cpp pointer and Recently used now fit one 1000 px-tall window without scrolling.
  • The search field and Add provider are one cluster instead of two distant corners, and a second account of the same provider repeats the provider's name, dimmed and indented, so a group reads on its own.
  • Recently used is a line of chips (provider, Sign in, remove) instead of a full-height list of rows.
  • Saving a terminal's launch settings — or opening one that was removed meanwhile — returns to that CLI's page instead of the machine-wide list.
  • The Matrix app is now called Canvas. Same boards, same panels, same links; the name says what it is. Old bookmarks keep working — #/app/matrix and #/app/matrix/<id> land on the canvas — and a tab you had open reopens as the Canvas tab, with the canvas and the view you left it at.
  • Every board is the canvas plane. The 12-column grid layout is gone, so there is one place a panel can be and one way to move it. A board still in grid mode was converted once, keeping the arrangement it had — a panel that was smaller than the canvas minimum comes out slightly larger.
  • The API and the feed were renamed with it: /api/matrices… is now /api/canvases… and the matrix.* events are canvas.*. PiCode's own clients ship in the same binary and were changed together.
  • PiCode loads lighter for everyone. Canvas is fetched the first time you open it instead of riding in every page load, and the two layout libraries the grid needed are gone: 18 KB gzip off the first load of the desktop, whether or not you use the app.
Removido · 10
  • The Go tray is deleted. picode-shell.exe is the only Windows resident — autostart, keepalive, health, disk line, Give-back, Restart, Logs — and picode-desktop.exe is its headless boundary tool (doctor install disk disk-compact clean startup-check startup-repair update). The systray dependency is gone, so a second tray cannot come back. A logon task that still points at the tray fails loud with the repair named; install registers the shell, staging it from the matching release when no sibling is beside the tool.
  • The last surface: terminal catalog row. Every launchable CLI now carries an adapter entry; the terminal-only shape stays as the form a future CLI without one rejoins.
  • The user menu no longer carries a layout switch. The Layout group (Desktop / Auto / Mobile) is gone from the menu in the browser, the desktop shell and the narrow/mobile layout — the surface follows the address you open (the launcher, /browser/, /desktop/, /mobile/). Theme (Light / System / Dark) stays in the menu.
  • From a Pi session in the create dialog (desktop and mobile) and its API, POST /api/clis/{cli}/sessions/adopt. Agents are born only from new sessions. Agents already created by adoption keep working; session files were never modified. The sessions surface keeps list, delete and auto-clean.
  • File and change panels can no longer be added. They had no tool of their own and the old Add panel dialog was their only way in. Panels already on a canvas keep working.
  • The sketch pad's canvas menu drops Load, Save to file, Export image and Save as image — the drawing is inserted into the composer, not saved from the pad.
  • Fullscreen no longer hands the browser's reserved keys to your agent. Capturing Ctrl+T, Ctrl+W and the rest needs a page that asked the browser for fullscreen itself, which the mode no longer does; those keys stay with the browser in every window. Everything else still reaches the terminal untouched.
  • Agent CLIs: the general Providers tab is gone. Provider accounts of a CLI are read in that CLI's Providers pane, so the tab strip no longer carries a second CLI picker.
  • Agent CLIs: the general Sessions tab is gone. Sessions of a CLI are read in that CLI's Sessions pane, so the tab strip no longer carries a machine-wide list.
  • Agent CLIs: the general Terminals tab is gone. A terminal is read in the Terminals section of the CLI that launches it, so the tab strip no longer carries a machine-wide list; an old #/clis/terminals link opens the CLI catalog.
Correções · 102
  • A terminal's folder is right from its first instant, for every reader. #{pane_current_path} answers with the tmux *server's* directory — the daemon's own working folder — for a pane tmux has not polled yet (#{pane_pid} is already set while it does: 33 of 40 creations in a loop), so anything reading a terminal's cwd in that window saw the wrong folder: the creation response, the file reader that resolves a relative path (GET /api/terminals/{id}/text, which answered 404 once under a sharded CI run), the Inspector's root. The tmux manager now remembers the folder it created each session in and answers with it for the first seconds, then follows the shell again.
  • In the desktop app, Documentation and other external links now open in the system browser instead of dead-clicking.
  • scripts/qa-scratch.sh stop ends the daemon it started (the pid the daemon itself wrote to data/server.json, with the remembered pid as fallback) and verifies the port afterwards, instead of killing whoever holds the recorded port: a stale port file used to make stop kill a neighbouring scratch's daemon and leave its own alive. If a different process holds that port, the stop now leaves it alone and says so; terminals are still removed through the API first, so no tmux session is orphaned.
  • start refuses a port someone else holds instead of killing its holder, records the daemon's pid, and status prints port, pid, liveness and health.
  • A tmux socket that cannot be created is an error, not silence: NewWithSocket creates the socket's directory, and tmux's error creating …/error connecting to … text (printed with exit status 0 by new-session) is promoted to an error. Before, a session on an unusable socket path "succeeded" with nothing behind it.
  • A new terminal's folder is right from the first response. The creation answer read the pane's directory live, and that read races the pane's own process: tmux returns the *server's* directory — the daemon's own working folder — until the shell has spawned (measured: 12 of 30 creations in a loop), so the UI and the Inspector could see the wrong folder for a moment. The creation answer now names the folder the session was created in; every later poll still reads the live path, where a cd shows up.
  • The app shell now really runs under the Content-Security-Policy: /browser/, /desktop/ and /mobile/ — the URLs the launcher and the desktop shell actually load — carried no policy at all, because the header matched only /, /index.html and *.html. The script hash is computed from the file each path serves, so each shell's inline theme bootstrap stays allowed.
  • The Inspector's Servers tab is reachable with nothing selected: the tab row used to render only when an agent, terminal or workspace was the anchor, so the rail's empty state ("Open an agent or terminal to inspect its files.") had no way to the one panel that is about the machine rather than the selection.
  • The download switch (and every browser preference) survives a save now. The page read the daemon's preferences twice — on load and after each save — with two copies of the same mapping, and the save path's copy had lost askDownload: the switch turned on, the answer came back, and the row snapped off, never to turn on again. One reader, web/browser/src/lib/browserPrefs.js, with the regression covered by tests.
  • The work browser's settings switches and actions now actually reach the app. The shell's ACL manifest (build.rs) never listed the commands added after the first slice — btab_set_prefs, btab_clear_data, btab_open_external and the whole Downloads set — so every invoke was refused with "not allowed by ACL" and the page swallowed the error. The commands are in the manifest and the capability now, with their generated permission files.
  • The download folder is picked with the app's folder browser (the same one the Add workspace dialog uses) instead of a typed path, and the picked place is translated from the daemon's tree to the Windows drive the browser writes on (/mnt/c/... → C:\...). A folder outside a Windows drive is refused with a line saying why.
  • One PiCode can no longer remove another PiCode's terminals. Every session PiCode creates now carries PICODE_INSTANCE, the data directory of the instance that created it, and the tmux inspector reads it: a session from a different PiCode on the same machine is labelled *another PiCode instance's work* — with the text saying which one — instead of being offered as a removable leftover. The removal itself refuses it, so the rule holds even if the request does not come from the screen. Sessions created before this version are told apart the same way, by the loopback port their session environment names.
  • The work-browser tab took the whole window down: WebTabSurface named the "Show full URL" preference in an effect's dependency array above the useState that declares it, so rendering any browser tab threw ReferenceError: Cannot access … before initialization and React unmounted the app (blank page, every tab gone). A deploy from main would have carried it; a plain-browser session on main reproduces it in one click on New browser tab.
  • The work-browser tab crashed the whole shell: an address-bar preference was read by an effect before its own state existed (ReferenceError: Cannot access … before initialization, blank window on every work-browser tab). The tab strip also never received the tabs' addresses, so every web tab read "New tab".
  • A long session preview no longer breaks the row. In the Sessions tabs the second line is the CLI's own prompt text — a paragraph, or a quoted Windows path. It sized the line to its whole text and pushed Open in terminal and the row menu outside the card; at the same time the model name (a secondary, single-line attribute) refused to shrink, squeezed the session name to nothing and painted over the age/size/count. A session row is now two deterministic lines: identity + facts, then the preview with its buttons, each clamped with …. Seen on Muse Code and Grok; every CLI's Sessions tab uses the same row.
  • Terminal settings: a failed refresh of the guard no longer leaves the old state on screen without a word.
  • Clearing site data no longer touches saved passwords or autofill; the earlier one-click version included general autofill in its mask and missed WebView2's own browsing history.
  • The server test that launches a terminal for the change feed no longer leaves the tmux session behind: cleanup ran with t.Context, which is canceled before cleanups start, so every tmux call it made failed and each test run left one session in the shared tmux server.
  • make ci no longer leaves orphan shells on your tmux server. The test suites that start real tmux servers (server, tmux, term) now run them on a private namespace that is torn down with the run — after a 2026-09-15 CI run left twelve orphan shells behind. The harness also refuses, by construction, to end a server outside its own directory.
  • Terminal settings say what is wrong when there is no tmux server to read. With every terminal closed, the terminal settings catalog now answers "Start a terminal to read the tmux option list." instead of an internal error — a state an isolated test suite exposed on 2026-09-15.
  • A guard-style wrapper finding its real binary no longer depends on dirname(1): under a minimal PATH it could resolve to itself and loop.
  • README and architecture docs corrected. The Agent CLIs list now names Muse Code and Antigravity as onboarding terminal-only entries, and the architecture pages match the current routes (/browser/, /api/canvases), the Go MCP broker, and the web/browser component paths.
  • Muse Code and Antigravity terminals wear their own mark in the sidebar, the tabs and the phone. A terminal launched with a CLI that reports no activity (both of them today) fell back to the plain-shell icon, the *Shell session* subtitle and the *Terminal open* status. Every surface now resolves the identity from the runtime CLI, otherwise from the CLI the terminal was launched with, so the row reads Antigravity · Open or Muse Code · Open like any other CLI. It also lands in the dashboard's CLI bucket instead of counting as a plain shell.
  • A terminal created while the page is open stops looking like a shell. The creation only announced the bare record, so a new Muse Code or Antigravity terminal kept the default icon until a reload; the launch view now travels on the feed with it.
  • **Canvas: the plane fills the pane again, and *No canvas yet* sits in the middle of it.** The page-frame change of 2026-09-14 dropped the surface's own flex column, so the stage collapsed to its content: an open canvas measured 0px tall (an invisible plane) and the empty state hugged the top of the tab. A native surface (Canvas, the QA demo) keeps that column now.
  • Create an agent in the grants empty state now opens the New agent form. It used to navigate home and nothing else (the handler called a helper that fell through to the default route). The copy also says what is true: grants apply to managed agents — sidebar sessions always read the tab on screen.
  • Grok 1.0.30 suggestions no longer block message delivery. The new build restyled the unaccepted suggestion in its composer, so automated prompts silently stayed pending. Both captured suggestion styles are now recognized, with the same strict frame, cursor and footer requirements.
  • Inbox replies reach legacy terminal questions. An ask_human item from pi in an Agent CLI terminal that predates per-question session stamping can now be answered from the Inbox when the terminal's pinned session and the conversation its receiver is showing agree; the item still stays open with an honest refusal when they disagree.
  • The agent split's browser pane stayed painted over other tabs: the native WebView2 kept its last bounds when the hosting tab was switched away (the pane mounts only for the active tab, and unmount never told the shell to hide). Switching tabs — or closing the pane — now parks the view; its page state survives and remounting brings it back.
  • Resuming a stopped CLI terminal that fails now says why on the pane ("Codex was not found. Check its executable or PATH.") instead of nothing changing when the button is pressed.
  • Sidebar: each tab (Workspaces, Agents, Terminals, Apps, Pins) keeps its header and search bar pinned at the top; scrolling now moves only the list, not the tab's controls.
  • Communication delivery survives slow TUI redraws. A native CLI (Grok and the others) that renders the received prompt late under load no longer ends a delivery as uncertain: the post-paste composer check is sampled inside a bounded window, and a refusal log names which guard refused without exposing screen content.
  • Destructive buttons on the phone (Delete) read destructive before the tap. They only had a hover style, and a phone has no hover.
  • Opening a link to an inbox item that is gone (answered or removed elsewhere) says so — "This item is no longer in the list" with Back to the list — instead of not found with a *Try again* that could never work.
  • The tmux app's Sessions tab shows its session count instead of a 21 · 21 unclaimed sentence, which no tab badge in the product had room for.
  • The split view's empty detail pane says "Pick an item from the list" — on a narrow window the list is above, not to the left.
  • Communication: OpenCode now receives messages in narrow windows with deep project folders. The delivery check no longer mistakes the wrapped folder path in OpenCode's footer for typed text; it accepts exactly the path rows the width implies and still refuses anything else.
  • Desktop: clicking a work-browser tab in the tab strip now selects it (it silently did nothing — openTab had no web branch and fell through to the agent lookup), and a selected browser tab no longer snaps back to the previous tab on the next route reconcile. Work-browser tabs own a #/web/<id> address the router writes and honors.
  • The guide was showing &#123;&#123;name&#125;&#125; instead of {{name}}. Every placeholder on the public Snippets page was written as an HTML entity, which a code block renders as literal text. The braces are real now, on that page and everywhere the guide shows one.
  • The Add/Edit endpoint buttons stay in reach. A tall custom endpoint form scrolled its Back / Add endpoint buttons off the bottom of the dialog, so saving meant scrolling to find them. The action row is now pinned to the dialog's (or the phone sheet's) bottom edge and the form scrolls under it.
  • Verify says what it covers instead of a status it never had. An endpoint whose API type PiCode cannot speak (a hand-edited models.json) answered "rejected the request (0)"; it now names the type and the four API shapes verification can address, and reports that nothing was spent.
  • A wrong key on a custom endpoint no longer reads as verified. Verify used to answer from credential presence, which stayed green for a bogus key; a gateway that cannot list, a refused key, an exhausted account and an unknown model each now say which one happened.
  • Quota readings no longer outlive their window. Limits now marks a reading whose window has already reset as stale · reset 2d ago instead of counting down to a past instant, and every row carries how old the reading is (hover). A panel fed by one CLI also says so: Covers Codex only.
  • A gateway's error message can no longer leak your key. If an endpoint echoes the API key back in an error, PiCode redacts it before the message reaches the browser.
  • The Today range drew one bar stretched across the whole chart. A one-day window was one calendar day, so the panel showed a single full-width block under a range picker that promised a chart. Today is now bucketed by hour (24 bars, labelled midnight … 11pm, panel titled Hourly), and every longer range keeps one bar per day.
  • The events verb now honours since: the sequence number the agent last saw travelled at the top level of the request, where the channel never read it, so every poll replayed the whole ring.
  • A hand-edited compat key no longer hides the provider from the GUI. A string value in compat (such as "thinkingFormat": "deepseek") made the whole entry fail to decode, so the provider silently vanished from the roster, Edit and the catalog while pi kept using it. The file is now read key by key and unknown keys are left untouched.
  • Right-clicking a selection inside a text field now offers Copy and Save selection as snippet enabled: the menu reads the field's own selection, which the page's selection never saw.
  • make desktop-shell actually builds the Windows shell again — the target was shadowed by the desktop-shell/ directory and reported "up to date".
  • Agent CLIs: the page no longer sticks on its loading skeletons when the terminal list is slow — GET /api/terminals now serves a shared snapshot (singleflight + 1s TTL) computed by a bounded worker pool, and the page keeps the last result that landed instead of discarding every response older than the newest request.
  • Agent CLIs: web-tab ids (w:<n>) no longer reach /api/agents/{id}/slash and /role-state as agent ids (console 404s).
  • A file, folder, git or app tab no longer asks the API for an agent's role. Selecting one of those tabs fetched /role-state and /slash with a tab id the server does not know as an agent — two 404s per selection, a chat composer asking a repository its role. Both fetches now ask isAgentTab (a bare id, not a tagged surface), so they run where an agent is on screen and nowhere else; the composer's role chip and slash list are unchanged on an agent tab.
  • Removing a workspace no longer takes the server down. The git watcher killed the whole daemon when it noticed a watched folder was gone: that path had left the watch set, and the pass still read the group it no longer had. A removal — a workspace, its last agent, or a folder that stopped being a repository — is now a quiet pass; the removal event is what reconciles the sidebar, as it always did.
  • Private connection setup no longer lingers on disk. PiCode removes a conversation's private setup files once its connection is revoked or the owner is deleted; the credential stopped working before, but the 0600 files used to stay behind.
  • Continue: a session too large for Native can still use Brief. The dialog no longer leaves Continue disabled; Native is offered only when the conversation fits, and Brief uses the recent turns.
  • Grok terminals show Needs you while a question card waits. The ask_user_question card notified an elicitation_dialog notification that the hook map ignored, so the row stayed on Working for the whole wait. The question is now reported as a held attention, and it survives the sibling tool completions Grok runs in the same parallel batch — the hold ends only when the question tool itself completes.
  • Terminal side padding is even. xterm's fit floors the column count, so unused pixels collected on the right of every pane (desktop app, browser, and phone). The leftover is now split so both sides match the terminal padding preference.
  • Right-clicking a canvas opens the canvas's own menu again. PiCode's generic menu (Copy, Paste, Reload PiCode…) was answering instead, which also meant that once you hid the canvas controls there was no way to bring them back. Right-clicking inside a terminal panel still opens that terminal's menu.
  • Keep a newly opened Claude Code terminal running when communication is enabled before its conversation is saved; connect after its first message creates a resumable conversation.
  • Keep terminal Pi message notifications pending while its editor contains an unsent draft, allowing delivery once the draft is cleared.
  • Explicitly ask native agents to execute the communication diagnostic after reading it.
  • Clicking the keyboard map no longer silently returns to Settings: the pane rewrote the route to carry the selected agent and dropped the sub-tab with it (the new pane cannot lose a tab it does not have, and the layer survives the same rewrite).
  • Deliver first-message notifications to an idle Grok welcome screen while preserving draft, identity and exact-submit safeguards.
  • Recognize an empty OpenCode editor with its sidebar visible and working directory wrapped below the footer. Communication now measures pointer fit against the editor width while retaining draft and post-paste edit protection.
  • The sketch pad on the phone fits the screen. The drawing surface now fills the usable area — no header under the status bar, no dead strip under the drawing — and its Cancel/Insert buttons are thumb-sized (44px). It lives inside the shell's viewport, so the software keyboard shrinks it correctly.
  • The sketch canvas is dark in dark mode. The pad asked Excalidraw for a near-black canvas, which its dark-theme filter inverted back to light; the canvas is plain white paper now, so the screen is dark and the PNG attached to the terminal stays a white sheet.
  • make worktree-status no longer reports a finished branch as a stalled one: a worktree whose branch main already contains reads *merged — make worktree-gc can remove it*, and the handoff board's In flight section lists only trees with unfinished work (a dirty tree is never called merged).
  • A settings value can now be *un-set*: PUT /api/pi-settings accepts patch.reset[] and removes exactly those keys from the layer's file (other keys, including ones PiCode does not know, stay). An unknown name is refused rather than reported as inherited. After a reset, a running agent adopts the effective compaction/steering/follow-up values instead of keeping the override that just left the file.
  • A malformed ~/.pi/agent/settings.json no longer disables the agent's own Model/Tools/Checklist fields on the mobile quick sheet.
  • web: a TUI booting inside a terminal (OpenCode boots straight into it) could freeze the pane at its first painted line until a reload. esbuild's minifier dropped the let declaration of xterm 6's requestMode enum while keeping the (n = {}) assignment, so the first DECRQM query threw ReferenceError: n is not defined inside the parser and stalled xterm's write pipeline. The desktop and mobile builds now pin @xterm/xterm to its UMD build, which ships the enum pre-compiled.
  • Recover observed native conversations and activity after a PiCode server restart on Linux/WSL, preserving running terminals, drafts and pending messages.
  • Show activity, connection status and completed communication tests separately on desktop and mobile; keep selected participants visible while reconnecting.
  • Renew Pi receiver presence without restarting its terminal, and bind Hermes message commands to the native conversation when a background review changes its environment.
  • Deliver pending messages when Grok's empty composer shows an unaccepted native suggestion, preserving typed drafts and native approval guards.
  • Keep live native hooks working on hosts without Linux process metadata; distinguish temporary recorder writes from permanent recording failures.
  • Show a failed connection with a Terminal controls action when state recording is blocked, and record bounded delivery failure reasons without logging message content.
  • Bind native message commands to the launched CLI even when PiCode inherits another agent's environment; refuse a missing native identity instead of selecting the parent conversation.
  • Mobile rendered the Connectors pane without its stylesheet (the CSS was only imported by the webhooks view, which mobile loads lazily). The pane imports its own styles now.
  • Removing the unreachable second "MCPs" view (#/mcps already rewrote to the Connectors pane) leaves one rendering path for both apps.
  • Zooming out no longer turns a terminal panel white. Below 75 % a panel shows its last screen as text instead of a live terminal, and that text was landing on the panel's own light ground — the same words, suddenly looking like something other than a terminal. The still now keeps the terminal's background and foreground, following your terminal theme.
  • Deploying from a PiCode terminal no longer refuses because of that terminal. The interlock that protects other people's turns counted the pane running picode deploy — which is working, by the act of asking — so a deploy started from inside PiCode could be told to wait for itself. It now ignores the caller's own pane; --force still means ending someone else's turn.
  • Opening Packages, Connectors or Settings from Agent CLIs while a workspace agent is selected (sidebar icon, then the pane tab) puts that agent and folder on the URL, so This workspace / This agent appear next to This machine.
  • Canvas links now attach to the sides of the panels that face each other. A link used to leave from one point at the top of each card wherever the two cards sat, so it could run out of a corner, cut across the panel it belonged to, or — when a panel carried several links — leave every one of them from the same spot. A link to a panel on the right now joins right edge to left edge, one below joins bottom to top, and a diagonal neighbour is met on the side it actually lies beyond. The line leaves and enters at a right angle to the border it touches, and follows the panels as you drag them.
  • Several links out of one panel fan out instead of stacking. Each one leaves from the point on that side which faces its own target, and two that would land on top of each other are pushed apart just far enough to read as two lines — in the order of their targets, so they do not cross.
  • The line you drag is the line you get. While you drag a new link, the preview leaves the same border the finished link will, and jumps to the other panel's facing border as soon as you are over a panel the link can land on.
  • Connectors opened from the composer, user menu, palette or More keep the selected agent and workspace in the URL, so “This agent” and reload after Add still work. Free agents resolve the same way as Packages.
  • #/packages and #/settings without a query adopt the selected pane again once the fleet is ready. #/clis/connectors rewrites to Pi. Extra path on Settings is blocked instead of opening the editor.
  • The terminal shows one scrollbar, never two. The web terminal is a tmux client and tmux attaches on the alternate screen, so xterm has no scrollback of its own — and yet it painted two one-pixel artefacts at the right edge of every terminal: its own scrollbar (one pixel wide, because overviewRuler.width is also its verticalScrollbarSize) and the overview ruler's white outline. Both are hidden now, on desktop and mobile, together with the eight-pixel scrollbar gutter the viewport reserved for a bar nobody could see (Chromium only removed it on touch platforms; the terminal surface painted over it). The fit keeps reserving the one pixel, so the text grid is unchanged, and the wheel still scrolls what it always scrolled — tmux's history or the TUI's own viewport. The scrollbar a reader sees is the one that belongs to whoever holds the scrollback.
  • The Inspector's branch chip is readable again. A branch name and a worktree name were sharing one chip's width, each with its own ellipsis, and together they read as · fe… ·…. The row shows the branch, which is what it is for; the worktree is in the tooltip with the rest, and on a narrow rail the *unpublished* / *detached* word steps aside for the name instead of the other way round.
  • Fullscreen: the Inspector button in the top strip shows the panel. It only flipped the rail's dock preference while fullscreen keeps the rail off screen by itself, so the click changed an icon and nothing on the page. Inside the mode it now lays the rail over the page at once — opening the rail when it was closed — and hiding it there takes only the overlay down, never the dock you set outside the mode. A panel opened that way stays until the same button, Escape or the mode: it no longer slides shut behind a pointer that never entered it. The right edge still works, and the rail can be turned on from the strip with the mode already running.
  • Approving a permission prompt no longer leaves the row saying "Needs you" while the agent works. Grok, Claude Code and Codex report a waiting prompt as needs-you, but none of them emits a "permission resolved" event, and none of them registered a tool-activity hook to contradict it — so the row stayed Needs you for the rest of the turn. A Grok plan-mode approval showed it for 10+ minutes after the plan had been approved. The tool lifecycle is now the resume signal (PostToolUse, plus PostToolUseFailure where the CLI has it), so the first tool that runs after the answer returns the terminal to Working.
  • A Grok notification that is not a permission prompt (task_complete, …) no longer turns the row into a false Needs you; only a permission UI that is actually waiting does.
  • The release dialog was 400 px wide, not the 560 px it asked for: .dlg is declared later in the stylesheet at the same specificity, so its width — and its padding, which kept the header and footer hairlines inset from the dialog's edge — won silently.
  • The matrix highlight of v0.2.0 wore a generic sparkle: the note's icon name had no glyph in either shell. Desktop draws it with the Canvas glyph, the phone with the panel grid, and web/tools/release-note-icons.test.mjs now fails when a published icon name is missing.
  • A build with no release notes showed the changelog link twice — once as the empty state's action and again in the footer.
  • Column headings are only drawn when there are rows, so an empty search no longer leaves a header over nothing, and the empty roster shows one action instead of two identical Add provider buttons.
  • With no providers connected the page no longer renders an empty toolbar row.
  • Dashboard: Grok's tokens, cost, turns, tool calls and timings now show up. The Grok coverage row said "prompt history only" and rendered — beside a CLI that has been writing a summary.json, an events.jsonl turn/tool timeline and a usage.json per-turn count into every session directory. Turns, tools and durations come from events.jsonl; the model from summary.json; tokens and cost from usage.json, which Grok only began writing in 1.0.x. Because older sessions have no usage.json, tokens and cost report as *partial* with both counts — the coverage row says exactly how many turns are priced — instead of a total that quietly omits them.
  • Inbox: ignoring a question from a pi in an Agent CLI terminal now closes it. Ignore sends nothing, so it no longer needs that terminal to be live and on the same session — it never claims "no reply" and then refuses to be dismissed.
  • Inbox: a reply to a terminal question fails with the truth. A pi in that terminal that had not opened a conversation (a nested pi -p, a print-mode run) could take the reply file and answer "the terminal is showing a different session". The daemon now refuses before parking when the receiver names no session, each reply file is addressed to the process whose hello was accepted, and a sessionless hello can no longer take that address over — so another pi in the same terminal can neither consume nor blind the reply.
  • Codex terminals no longer try to resume a sub-agent conversation. Codex multi-agent v2 sub-agents (helper threads like "Gibbs") could overwrite the conversation a terminal remembers, and Codex refuses to resume them (Process exited (1)). Sub-agent threads are now ignored for resume, in live hook reports and in the session list — resume always brings back the conversation you were in.
  • An old #/clis/terminals?… link now rewrites the address to #/clis like the plain address always did, instead of keeping the stale URL while showing the catalog.
Segurança · 3
  • frame-src (with the dev-server preview) allows PiCode's own browser surface to frame this machine's localhost/127.0.0.1 pages over http(s) and nothing else; the framed page remains a separate origin with its own policy, and frame-ancestors 'self' keeps PiCode itself unframed by others.
  • Read is the default and the ceiling: an agent with no grant reads the tab the human has on screen, and cannot click, type or navigate. Anything more needs an explicit per-agent grant (Settings ▸ Browser, next).
  • The desktop debug port is off by default. It was opened on loopback in every launch; it is now an explicit PICODE_CDP_PORT opt-in for external tooling. The agent access tiers (read / act / full) are enforced against a named command catalog, and an unnamed command is refused at every tier.

0.2.0

79 novos · 42 melhorias · 54 correções

Novo

  • Matrix: a managed agent's panel is now its live conversation. Where a managed agent's panel said *Managed agent — open to read.*, it shows what the agent is saying as it says it — the same turns, tool cards, diffs and markdown its tab shows, scrolling itself, in a read-only layout with no composer and no queue controls. When the agent is waiting on a person the chip says Needs you, the body shows the question and the choices it offers, and a line across the bottom of the panel carries it with Open, which takes you to the tab where you answer. The chip comes from the fleet, not from the panel's connection, so a panel that is asleep, paused or zoomed down to a name-plate still tells you which agent is blocked.
  • Link two Matrix panels, and the two sessions can message each other. On a matrix canvas, hover a panel and drag the connector in its header onto another panel. The line grants exactly one thing: those two sessions gain each other as a contact in PiCode's existing messaging. One can send the other a message and read the replies — that is all it does.
  • A link never grants a transcript. It does not let one session read the other's history, scrollback, session file or anything typed into it. The supported way to get context out of another session is to ask it and let it answer in its own words. The guide says so in plain words.
  • Two sessions in different project folders can now be paired, per pair, by hand. The workspace rule is unchanged and there is no owner-wide switch: the blast radius of a link is two named sessions you drew a line between.
  • Nothing is connected quietly. Drawing a line to a session that is not connected offers the existing connection in one line, with what it grants; drawing across two project folders asks again, separately, naming both folders. Cancel at either point writes nothing at all — no link, no connection.
  • Removing the line removes the permission, with nothing left over: PiCode derives who may message whom from the links that exist right now, so deleting the line, either panel, or the matrix revokes it immediately.
  • A link that grants nothing reads broken, in amber and marked *Broken*, with the reason when you point at it — the connection was revoked, the session moved, the target is gone, or it was never connected. It is never a faded version of a working link.
  • Matrix links, in the Messages view. Every link you have drawn, anywhere: both ends, the matrix it lives on, whether it works right now, and a Remove that revokes it exactly as the canvas does. It is not filtered by the folder picker, because links across folders are the ones worth seeing. Grid mode, which has no plane to draw on, shows a per-panel link count in the header and sends you here.
  • Matrix: a panel can be a pinned note. Add one from Add panel → Pins: the panel shows that pin's markdown, read-only, follows it as you edit it elsewhere, and its header opens Pin Studio. A note whose pin was deleted says so and offers Remove, the way a deleted terminal does.
  • Matrix: a panel can be a file. Add panel → Open files offers the files you already have open in a tab; the panel is the same editor, with Save. It says *Unsaved* while you have changes, keeps them when you maximize it or switch layout, and never goes to sleep holding them.
  • Matrix: a panel can be the changes to a file. The same list offers each open file as Changes to an open file: the panel shows that path's diff and keeps it current as the file changes, with Open file to jump to the editor. One file can be on a matrix twice, as the file and as its diff.
  • The Matrix canvas — your panels on a plane you pan and zoom. A matrix header now has a Grid | Canvas switch. On a canvas a panel goes anywhere: drag it by its header, resize it from any edge or corner, drag a box around several and move them together, pan with the middle button or by holding Space, zoom with the wheel or the + / − buttons, and 0 fits everything on screen. A minimap in the corner shows the whole plane. The arrow keys still move between panels — an off-screen one is brought into view — Enter still starts typing in that panel's terminal, and Delete still removes it with an Undo. Switching to the canvas converts the whole matrix in one step and switching back packs it into the 12 columns again (it asks first, since the plane positions are not kept). Where you left the camera is remembered per browser, so two people looking at the same matrix never yank each other's view.
  • Zoomed out, a panel shows its last screen instead of a live one. Below about 75 % a panel stops being a connected terminal and shows the text of the screen it last had — sharp, free, and stamped with its age in the header if the panel has done something since; below about 40 % it becomes a name-plate with the face, name and status, sized so it stays readable however far out you are. Zoom back in and the same terminals reconnect where they left off. That is what lets a canvas hold hundreds of panels without hundreds of connections.
  • A terminal takes the mouse at 100 % only, and says so. A terminal panel is readable and typeable from 80 % up, but a *click* is only accurate at 100 %: below it the terminal would put your click on the wrong cell, and with mouse reporting on that wrong cell reaches the program running inside. So away from 100 % the panel body does not take clicks — clicking it zooms the canvas back to 100 % first, and then your click lands where you aimed it. The zoom percentage sits next to the minimap and takes you back to 100 % in one press.
  • Tidy. The matrix menu gains Tidy panels on a canvas: it lays them out again in reading order, keeping each panel's size, and saves once.
  • Mobile: Back from an agent or terminal lands where the work lives. A workspace's agent or terminal returns to Workspaces focused on that workspace's group; a free one returns to its own Agents or Terminals list — never a flat section it was never in.
  • A matrix can be a canvas, from the API. Every matrix now has a layout mode: the 12-column grid it has always had, or a canvas where panels sit on a plane with no columns and no bottom — coordinates in 8 px units that may run negative. PATCH /api/matrices/{id} takes mode and answers with the matrix plus every panel it moved: switching converts the whole matrix in one step (a grid cell becomes 8 units across and 3 down; coming back divides, rounds and tidies the panels so none overlap and none is lost), and switching to the mode it already has changes nothing. Matrices made before this keep the grid. There is no canvas to look at yet — the panels, the mode switch and the pan-and-zoom surface are the next step; this release is the model underneath, exercised by tests.
  • Fullscreen hands the browser's keys to your agent. In a normal window the browser keeps its reserved shortcuts (Ctrl+T new tab, Ctrl+W close tab, Ctrl+N new window) before PiCode can see them — so a CLI chord like Codex's Ctrl+T opened a browser tab instead. Fullscreen mode (Ctrl+Shift+Enter) now also locks the keyboard (Chrome/Edge/Opera): every key reaches the page, terminals get their chords back, Escape still leaves the mode outside a terminal, and holding Escape for about two seconds is always an exit. Firefox and Safari keep the previous behavior until they support the API.
  • Fullscreen: any tab can take the whole window. Right-click anywhere in the desktop app — a terminal, an app, a file, the conversation — and choose Fullscreen (Ctrl+Shift+Enter, Cmd+Shift+Enter, or the command palette). The sidebar, the tab strip and the Inspector rail step out of the way and the tab you are on fills the screen. Nothing is closed: touch the left edge with the pointer and the sidebar slides back over the page, the top edge brings the tabs back — with a Leave fullscreen button at their right end — and the right edge brings the Inspector back if it was open when you started. Each edge waits a moment before opening, so crossing it on the way somewhere else does not flash it, and it stays while the pointer is on it. Esc leaves. The mode is remembered per browser, so a reload comes back into it, and it is offered on every tab except the git graph's own commit menu.
  • The browser goes fullscreen too. Turning it on also asks the browser for real fullscreen, so the app is the whole screen and not just the whole page; leaving gives the window back, and if you exit fullscreen yourself (F11, Esc) the mode ends with it. A browser that refuses fullscreen still hides the app's own chrome. A reload cannot ask for fullscreen — there is no click to ask with — so it returns to the in-app mode, with the top edge still there to leave from.
  • Matrix — a live grid of your agents and terminals. The Apps tab has a Matrix tile: create a matrix, add panels from a picker of your agents and terminals, drag them by the header and resize them by the corner or an edge. Each panel shows the real terminal or agent screen — the same one its tab shows — with the sidebar's Working / Needs you / Ready word in its header. Only the panels near what you are looking at stay connected, so a matrix can hold hundreds; layouts save as you go and every browser sees the same matrices (#/app/matrix/<id>). The guide is Matrix.
  • Keyboard across a matrix. Click a panel or tab into one, then move with the arrow keys (the target scrolls into view and wakes up), Home and End for the first and last, Enter to start typing in that panel's terminal, Shift+Esc to come back out to the panel, Delete to remove it with an Undo. A plain Esc still belongs to the program in the terminal.
  • Maximize a panel. The ⤢ button gives one panel the whole surface — the terminal resizes to the space, the matrix keeps its layout underneath, and the panel's slot says *Shown maximized*. Esc or the button puts it back.
  • Workspace Communication on desktop and mobile: select managed Pi agents and native terminals, apply their connections, and follow preparation and activity in one view.
  • Run a connection test through the participants' native tools. A test passes only after a message, correlated reply and both acknowledgments; pending and unconfirmed results remain visible.
  • Agent CLIs → Messages: native Grok and Hermes communication through picode messages contacts|send|read|ack, sharing the existing MCP mailbox, authorization and history.
  • Stored messages can notify an already open conversation through Pi's native receiver or a guarded TUI pointer. History distinguishes pending, notified, unconfirmed and acknowledged messages.
  • Matrix API and feed events. Matrices — named 12-column grids of agent and terminal panels — are stored, shared across browsers and announced on the change feed: GET/POST /api/matrices, GET/PATCH/DELETE /api/matrices/{id}, PATCH …/layout (the changed subset, 409 when stale), POST …/panels, DELETE …/panels/{panelId}, and six matrix.* events. Limits refuse with the limit named (64 matrices, 500 panels each, 80-character names, panels of at least 4×8 cells). No surface yet — the Matrix app itself is phase 3.
  • picode version (--version, -v). Prints the build identity and exits. The install verifier already ran picode --version; until now the flag silently started a server instead.
  • Messages can save private setup for recorded Pi, Claude Code, Codex and OpenCode conversations and attach it when they resume. Desktop and mobile show the next action, including installing the Pi adapter when needed.
  • Automatic local HTTPS setup supplies verified public CA material to the launched client while preserving existing configured CA bundles.
  • Direct session messages: an embedded HTTP MCP endpoint with same-workspace opt-in, scoped credentials, durable receipts, retry deduplication and explicit acknowledgements. Agent CLIs → Messages on desktop/mobile manages connections and history. Client setup is manual per conversation; no automatic agent turn or terminal migration.
  • Automations: several schedules per automation. The editor's Schedule block is now a list: each rule has its own preset (Hourly, Daily, Weekdays, Weekly, Custom), an optional label, its own switch and Remove, plus *Add a schedule* — "weekdays at 09:00 and Saturday at noon" no longer needs two automations. Each rule is its own clock (own jitter, own catch-up, saved in the browser's time zone); the list and the detail summarise every rule; the Runs table names the rule that fired. The API returns schedules on every automation (each with nextFireAt) and takes schedules on create and PATCH; cron stays as the one-rule shorthand. Editing a rule's time starts it over instead of catching up a slot it was never asked for. Migration 038 moves existing schedules into rows with their last fire intact.
  • Pins on the phone: create and edit. More → Pins lists your pins (starred first, search over title, tags and note) with a + that opens a form — title, tags, the note as markdown — and the pin screen gains Edit. Drafts are retained and a stale save answers with the conflict message, as on the desk. Files, sketches and reminders stay with the desktop studio.
  • Git graph: per-commit +/- in the listing. Every commit row shows the lines its own diff adds and removes (+178 −80, green/red, blank when a commit changes no text — empty or binary-only commits), so the shape of history reads without opening each commit. The numbers are git's own shortstat totals over the commit's first-parent diff — the same diff the opened commit detail shows per file (they reconcile exactly, merges included).
  • Pins: search, keep on top, archive. The Pins tab has a search box over title, tags and note (every word must match; archived pins are found too and say so). A star keeps a pin on top of the list; Archive takes it out of the sidebar into an "N archived" view one click away, pauses its reminder and closes an open reminder item, and Unarchive brings it back (a slot missed meanwhile fires once). The studio has Archive and Keep on top beside Delete; the phone's pin screen shows "on top" / "archived". GET /api/pins?q= and ?archived=1, POST /api/pins/{id}/starred and /archived (migration 037).
  • Pins: reminders on screen. The studio has a "Remind me" chip: presets first (in 1 h, in 3 h, tomorrow morning, next Monday morning, every day, every weekday — day presets at a morning hour you can change), then every N hours with "count from when I close it", a date-and-time picker and a cron field; the chip and the sidebar card read the rule back in words with its next fire ("every day at 09:00 · next tomorrow 09:00"). When a reminder fires, a card with the pin's glyph stays on screen until you act — on the desk and on the phone: X closes it (the Inbox item goes done everywhere), Snooze hides it for an hour, Open lands on the pin. A reminder owed is shown on load too; more than three open reminders collapse into one "N reminders" card that opens the Inbox. Preferences → Notifications gains "When a pin reminder is due" for the card, and the push switches gain the same for the phone. The Inbox app's reminder rows say "Pin" and their "Open pin" goes to the pin. On the phone #/pins/<id> opens a read-only pin (title, tags, reminder line, pictures, note) instead of landing on Settings.
  • Pins: reminders, server side. PUT /api/pins/{id}/reminder sets one cadence per pin — once at a date and time, interval every N minutes (at least 5) counted from the schedule or from the moment you close the reminder, or cron (five fields) evaluated in the IANA zone the browser sends — and DELETE removes it; the rule rides GET /api/pins/{id} and the list summary with its next fire and a plain-language label ("every day at 09:00", "every 3 h after you close it"). A one-minute engine (internal/remind, same shape as Automations) files each fire as an Inbox item of the new kind reminder (source pin): the item is the acknowledgement — unread means owed, snoozed means snoozed, done means closed — and the feed announces pin.reminded. A fire while the previous item is still open re-raises that item instead of piling up; a snoozed item stays quiet and is re-raised once the snooze ends; a slot missed while PiCode was down fires once with "Was due …" in the body; deleting the pin or the rule closes its open item. Phones with push get a reminder:<item> push under a new reminders preference (on by default), kept on screen where the platform honours requireInteraction. The Inbox app shows the kind with an "Open pin" action. GET /api/inbox?kind= filters. The in-app sticky card and the picker are the next slice.
  • Packages: view, edit and reset package configuration (pi-roles first,). Installed packages render as the familiar card grid, now filterable, with Configure beside Update/Remove on packages with a known config adapter. The pi-roles editor (#/packages/config/pi-roles) edits the same files the extension reads — the workspace .pi/roles.json and the per-agent overlay .pi/roles/<agentId>.json — and shows the effective merge: inherited slots are visible (and can be overridden for one agent), overrides can fall back to the workspace value with one click, and each layer can be cleared with a confirmed "Clear file…". A file the parser rejects is reported, never silently overwritten (explicit replace). Saves write atomically, preserve unknown keys, announce on the change feed, and say when they apply ("on the agent's next message"). The page follows the house control recipe throughout — selects and inputs share the system's height, radius and focus language in light and dark — and a thinking level cannot be set without a model (it would have been silently dropped on save).
  • Mobile: Preferences → Layout — fit the shell to your screen. Two dials with platform-smart defaults: Bottom bar buttons (Auto / Low / Screen edge) and Bottom bar height (48/56/64px). "Auto" anchors the buttons low only when the bootstrap measured a letterboxed standalone install (WebKit 313800/317153 — the behavior varies by iOS generation and icon install date); "Screen edge" is the former strip-probe experiment as a user choice, honest about the clipping risk in its own label. Applied before first paint, persisted per device like the theme. Side fix: the Preferences tabs kept their choice in the desktop hash space (#/preferences/<tab>), which the mobile router can't express — every tab click silently fell back to Appearance; tabs are now component state.
  • Public docs: working inside a terminal. The Agent CLIs guide gains *Inside the terminal pane* — the right-click menu, the Shift bypass to the browser's own menu, the message bar that opens from it, find with its three toggles, and a table of every terminal key. The Attach paragraph no longer describes a bar that stands under the pane on desktop; it opens from the menu now. Agent CLIs.
  • The git graph's actions on the phone. A long press on a history row — or Actions on a commit or worktree view — opens a sheet with the same vocabulary the desktop graph offers, in the same tiers, through the same doors: prepared in a terminal, run when nobody is working there, or asked of an agent or pi terminal living in that worktree. The exact command is composed by the server and shown before anything is sent; a tier C action through the run door asks you to type a word first.
  • The worktree removal form names its field. "Name" over a worktree folder read as nothing; it says *Worktree folder name* now, like the create form.
  • A clean sibling worktree can be removed from its branch pill. A checkout with nothing uncommitted draws no row of its own, so the graph had no place to offer *Remove this worktree* for it; the branch pill of a branch checked out elsewhere now carries the worktree's rows.
  • "Ask Pi" reaches pi running as a terminal. A pi launched from Agent CLIs now carries the same receiver an interactive agent does, so the git graph lists it beside the agents of its worktree, offers Open Pi into its pane, and can ask it to do a git action in its own turn — delivered through the receiver with the session row as proof, never pasted. Without a live receiver or a named session the option is absent and the request says why. Other CLIs (Claude Code, Codex…) are unchanged: no receiver, no ask.
  • The git graph acts on what you point at. Thirty-odd git actions bound to the row or pill under the cursor — create a branch, tag or worktree, check out, merge, rebase, cherry-pick, revert, reset, pull, push, delete — each delivered through a door that already existed: prepared in your terminal for you to press Enter, run there when nobody else is working in the repository, or asked of an agent that lives in that folder. PiCode still never runs git itself. Actions carry a risk tier: the ones that publish or destroy work are marked, and when PiCode is the one pressing Enter they ask you to type a word first. The exact command is composed on the server and shown before anything is sent, so the preview and the command are the same string.
  • A worktree and the agent that lives in it, in one gesture. "Create a worktree…" on any commit or branch can also start an agent in it once the folder exists.
  • Undo, where there is an honest one. After an action that only moved the branch — merge, rebase, pull, reset, commit — the graph offers to put it back where it was, and says plainly that it prepares the command rather than undoing anything by itself. A push or a git clean gets no such offer, because there is no inverse to give.
  • The git graph answers a right-click. Every row and pill now carries a menu naming what you pointed at: a commit offers its hash and subject, a branch its name, a worktree row its path and the agents living there. A local branch says which checkout holds it — and when that is a sibling worktree, the menu offers Open <agent> instead of a checkout git would refuse. Branch pills show how far they have drifted from their upstream (↑182). The pills on a row are also reachable from the row's own menu, so a keyboard reaches everything a right-click does. This is the read-only first phase; nothing here runs git yet.
  • Find inside a terminal (Ctrl+Shift+F, or Find… in the pane's right-click menu): a field floats over the terminal — searching never resizes the pane — highlights every match, counts them (3/14), and walks them with Enter and Shift+Enter; Escape closes it and gives the keyboard back to the terminal. Match case, whole word and regular expression are three toggles in the field, kept for the life of the page; a pattern that does not compile yet says *Invalid pattern* rather than pretending there is nothing to find. The plain Ctrl+F still belongs to whatever runs in the pane (less, vim, readline), and the chord is rebindable in Settings → Shortcuts.
  • A waiting agent says so on the screen you are on, whatever agent it is: when any managed agent stops for a question, a card names it — Atlas · needs you · QA, the question, its detail and an Answer button that opens the conversation. Unlike the finished card this one covers the whole fleet, not just the agent you have open: the runtime already publishes every dialog edge on the change feed. The card has no timer — it goes away when the question is answered, or when you open the conversation that answers it — and a reload never replays a backlog the sidebar badge already shows. On the phone the Now screen stays quiet, because that screen *is* the queue.
  • Notification preferences say what to announce, not where the box sits: *When an agent needs me* and *When a run finishes*, worded like the push switches above them. Turning one off silences that announcement only — the sidebar badge, the Inbox and the phone are untouched. "Close position" and "Rich colors" are gone: the card draws its own close control, and a level already reads from its glyph and border. Position, duration, visible-at-once, expand and close button are unchanged, and an old stored value is simply ignored.
  • Right-click inside a terminal now opens PiCode's own menu, built from what that pane can actually do: copy, paste and select all; on a running Agent CLI, Ask <CLI> about this and Attach files…; Open for the file or link under the cursor; go to the end and text size; Clear on a bare shell only, because a TUI owns its screen; rename, terminal settings, the folder in Files, close the tab and remove the terminal — the last group never on an agent's own TUI pane. Holding the bypass modifier (Shift by default, Settings → Context menu) still hands the click to the browser's own menu. The right button no longer reaches tmux, which used to answer it with a second menu drawn inside the terminal.
  • The terminal's message bar is no longer permanent chrome. It opens from that menu — empty, or already carrying the selection: one line lands in the message, anything longer is attached as selection.txt so the CLI reads a whole file instead of a mangled paste. A close button (or Escape) gives the pane the full height of the editor back.
  • Toasts are notice cards, and a finished agent turn is one of them: an announcement now carries who spoke, how long they worked, what changed and one way out — claude · finished · worked for 7s, the agent's own last sentence, 1 file +46 −1, and an Open pill — instead of a bare string. When a turn settles while you are looking at another tab, another view, or another application, that card is what tells you; it stays quiet when the agent's own conversation is the focused surface, and a second finish from the same agent replaces its card instead of stacking a new one. Errors now live 12–30 s instead of 4, because an error nobody was looking at was a lost error. The 317 existing one-line toasts keep their wording and gain a level glyph. Position, duration, visible-at-once, expand, close button, close position and rich colours all keep working. Adapted from the Superset study in docs/benchmarks/2026-09-07-superset-notifications.md.
  • Public docs: agent terminals over SSH: a new guide page shows how to reach PiCode's tmux sessions over SSH (tmux attach, read-only supervision with -r, Tailscale SSH on a server box) and the one rule: never kill sessions by name pattern. Agent terminals over SSH.
  • Public docs for moving a conversation between agents: the Agent CLIs guide now explains the two ways a session arrives (a native session, or the vendor's own import for the SQLite-backed CLIs), the choices in the dialog, and what stays behind; the home page names the capability.
  • A workspace reaches its own files and history with nobody in it: Files and Git graph on the workspace card's menu open the project's own file tree and commit graph — no agent and no terminal required. The graph, the commit details and the uncommitted changes read through /api/workspaces/{id}/…, which the server has answered; a workspace-owned graph tab now also survives a reload and a deep link (#/git/w/<id>) instead of reporting "That agent is gone".
  • Handoff dialog polish, from the visual pass that was owed: a session with no title of its own is no longer named after the handoff note, the dialog names it by a short id instead of a full UUID, and the summary line counts a CLI's internal record types instead of spelling them out ("bridge session left out (4)" meant nothing to a reader).
  • Repository picker in the clone form: the New-workspace "Clone repository" URL field is now a filterable combobox fed by the GitHub repositories behind the machine's own gh login (gh repo list via the new GET /api/github/repos, cached 5 min). Typing filters owner/repo and descriptions, grouped by owner, with a lock on private repositories; picking one fills URL, name and destination at once. Pasting any URL still works first-class — a pasted URL shows a "Use this URL" row and Enter submits it as before. Missing gh / not-logged-in machines show one line with the one action that fixes it (install guide / copy the gh auth login command); mobile gets the same list as a tap-to-open picker next to the URL field.
  • Mobile Files and Git: full-screen file browsing, search, editing and previews with unsaved-change and file-conflict recovery; Git changes, history, branches, worktree/commit details, PR status and existing terminal/agent action channels. Workspace history now works without an agent; supplied folder preconditions are checked for history and commits across workspaces, agents and terminals.
  • Mobile tools: Agent CLIs now includes Sessions, and More includes Automations with list, editor, run history and recoverable loading errors.
  • Every Agent CLI can now receive a session handoff. OpenCode joins as a source and a target, Grok gains a native session (a live probe showed summary.json and chat_history.jsonl are all --resume needs), and Hermes becomes a target through hermes sessions import. For the two SQLite-backed CLIs PiCode hands the conversation to the vendor's own import command instead of writing their store, then reads the session back. A written session records the model of the installation that will answer next, never the source's, which Grok refused and Claude Code could not restore; the source model rides in the handoff note instead.
  • llama.cpp installation cleanup: desktop and mobile can review and remove verified older installations while retaining the current version, restoration version and unknown files.
  • Install a missing CLI: the Agent CLIs surface offers an Install action when a catalogued CLI is not installed — npm-backed for pi, Codex and Claude Code through the same durable job lane; Grok and Hermes Agent show their vendor's install guide instead. Installing an installed CLI is refused.
  • Managed local llama.cpp service: desktop/mobile Local service page with CPU presets, saved settings, verified installation, reviewed start/stop/ restart/update/rollback, durable progress, ownership-aware cache cleanup and redacted diagnostics. External routers are never adopted.
  • Attach a photo or file to an Agent CLI terminal. On a running Claude Code, Codex, Grok, Hermes, OpenCode or Pi CLI terminal, an attach bar (desktop) or header paperclip (phone) stages the file in the terminal folder and types the path into the TUI. Caps: four files, 4 MB each. Inspector Git type/run still does not type into a CLI.
  • CLI lifecycle management: update checks, update, reinstall and uninstall for catalogued agent CLIs. The Agent CLIs surface shows an update badge with the latest version (npm registry or the vendor's own --check command) and runs each CLI's native update/reinstall/uninstall command as a durable job with streamed output, terminal guards and typed uninstall confirmation. Install methods PiCode cannot manage (Homebrew, manual checkouts; Grok and native Claude Code uninstalls) show their official guide instead of controls. Jobs survive daemon restarts as interrupted — never replayed.
  • OpenCode in Agent CLIs: the catalog launches the installed opencode command in a terminal, lists top-level sessions from ~/.local/share/opencode/opencode.db (or $XDG_DATA_HOME/opencode/opencode.db) read-only, and resumes with opencode --session <id>. Activity reporting is a presence lease plus a session-only plugin injected through OPENCODE_CONFIG (session busy/idle, permission and question prompts) — not a data-dir overlay and not by writing ~/.config/opencode. Maintenance subcommands skip the plugin. Update/reinstall/uninstall use opencode upgrade and opencode uninstall --keep-config --keep-data --force (the vendor commands, including bun-global installs classified as npm by path). OpenCode lists sessions for the Sessions tab, and gives and receives a handoff (see below).
  • Continue a session in another Agent CLI: the Sessions tab offers "Continue in <CLI>…" for every CLI the server says can receive the session. A preview shows what travels and what is left behind; the handoff writes a new native session for Claude Code or Codex, adopts a new Pi agent, or starts a CLI from a deterministic brief. Grok sessions now list their real transcripts (title, model, size) and Hermes sessions can be read. Lineage shows on both rows.
  • Hermes Agent in Agent CLIs: the catalog launches the installed hermes command in a terminal, lists cli/tui sessions from ~/.hermes/state.db read-only, and resumes with hermes --resume <id>. Activity reporting is a presence lease plus session-only activity hooks (LLM start/end and approval prompts) injected through PYTHONPATH sitecustomize — not a HERMES_HOME overlay and not by writing config.yaml. Hermes may still record PiCode's hook command in its own shell-hooks-allowlist.json when auto-accepting. Check setup keeps the first --version line so Hermes' install dump does not wrap the heading.
  • Deploy refuses while agents work. picode deploy asks the running daemon who is mid-turn and stops before touching the installed binary when anyone is — the refusal names each agent or terminal and why. picode deploy --force (or PICODE_DEPLOY_FORCE=1 make deploy) is the deliberate override. make deploy-batch and the picode-deploy.timer (12:00, 18:00, 23:00; make timers installs it) ship main in batches, refreshing stale public screenshots first. New loopback-only route GET /api/deploy/readiness.
  • Inspector: ask a running agent to do a Git action. For every agent running in the rail's repository — managed or in its own terminal — the Git menu now lists an "Ask &lt;name&gt;" submenu with the same actions. Asking sends the agent a plain-language message through the channel that already carries its prompts: a queued turn for a managed agent (delivered at once, or as a follow-up once its current turn ends) or the Inbox reply's own door into a TUI (the receiver extension, or a bracketed paste). The agent decides how and runs it in its own turn; PiCode never runs git here. The commit form's message becomes optional when asking — left empty, the agent writes one from the changes. A stopped agent, or a terminal hosting a coding CLI, is not offered.
  • Inspector: run Git actions when nobody is working. The Git menu gains a per-viewer checkbox, "Run when no agent is working here". With it on, PiCode types the command into your terminal and presses Enter itself, but only when no agent in that repository is mid-turn, no automation is running there, and no other terminal there is working or holding a program; otherwise the command is prepared as before and a note says who is busy. Git still runs in your own shell with your credentials and hooks. Typing now also refuses a terminal that moved away from the folder or whose pane is not at a shell prompt, and takes a fresh terminal instead. Right-hand toasts step left of the rail while it is open, so a note never covers its buttons.
  • Session forensics: the daemon now records which tmux sessions were alive at a graceful shutdown and reports at boot exactly which ones did not survive (log + var/restart-report-*.json), stopped CLI terminals say "PiCode restarted while this terminal was running" when that applies, launch scripts ignore SIGHUP like interactive shells always did (explicit Stop escalates to SIGTERM so stopping still stops), and every picode deploy appends who/what/where to var/deploy-log.jsonl. The next session-loss incident self-reports.
  • CLI terminal session recovery: every CLI terminal now pins the native conversation it is running (claude, codex, grok, pi) and a stopped terminal offers "Resume last session" — one click relaunches the CLI with its verified resume arguments. A deploy, crash or daemon restart no longer costs the conversation; the pin is stored (terminal.last_session event) so it survives the process. Plain start is unchanged; nothing auto-restarts. Desktop and mobile terminal surfaces both carry the button.
  • Contextual llama.cpp model guidance: GGUF choices show file size, estimated runtime memory and a hardware-oriented starting recommendation.
  • Checklist disclosure on sidebar cards (docs/plans/sidebar-checklist- expand.md). Clicking a card's plan line expands the full list in place: ☑ on finished steps, the braille spinner on the one being executed, ☐ on the rest. The items are already in client state and arrive over the feed, so opening costs no fetch and updates render live while open. Works on agent and terminal cards; the line is a real button (aria-expanded, Enter opens, Escape closes) and never navigates. No server change.
  • llama.cpp operation activity: load, unload and download now run as persistent jobs. Activity shows per-file progress, reconnect outcomes and supported download cancellation on desktop/mobile. Duplicate requests are deduplicated; conflicting model operations are refused. Unknown results remain visible rather than being reported as success.
Melhorias · 42
  • Matrix: what a conversation panel costs, and what bounds it. A conversation holds a WebSocket and a transcript, so it is live only where it can be read: in the band and at 40 % zoom or more. Below 40 % a panel is a name-plate and its connection closes; outside the band it unmounts after the same five seconds every other body gets, and reconnects with its conversation when it comes back. At most twelve conversations are live at once — the twelve you scrolled to most recently — and the rest say *Paused* until a slot frees. Measured with twenty managed agents on one matrix: nine connections at rest, twelve at the cap with six paused mid-scroll, never thirteen.
  • Participant selection carries forward to future conversations in the selected workspace. Each conversation keeps a separate credential; clearing a selection revokes its connections atomically.
  • Normal setup offers Apply and connect, Open and connect and repair actions, with per-conversation configuration under Advanced.
  • Agent CLI terminal menus are one menu everywhere: the sidebar terminal rows and the Agent CLIs terminal list render the same rows — Rename…, Launch settings, Terminal settings, Start/Restart/Stop terminal (per running state) and Remove terminal. The sidebar gains Start/Restart/Stop and Launch settings; the Agent CLIs list gains Rename… and Terminal settings.
  • Grok/Hermes integration uses native hooks/plugins with ownership receipts and preserves their native executable, home and unrelated configuration.
  • Apps host: a first-party app may declare a native surface. A manifest can say surface: "native": the app's body is then a component compiled into the desktop shell instead of a primitives view, opened from the same tile, tab and #/app/<id> route. The phone lists such an app as *Desktop only* and answers its link with one line and Back; a desktop build that lacks the surface dims the tile as needing a newer PiCode. No shipped app uses it yet — the only native app is the hidden QA demo behind PICODE_DEMO_APP=1, which shows a live terminal; a terminal shown there and in its own tab follows whichever is visible.
  • Workspace cards: the plan (checklist) line no longer shows a chevron — the whole line stays clickable to expand the plan, and the line is now italic, matching the plan's voice.
  • Document verified native conversation resumes and acknowledged message roundtrips for Claude Code/Codex and OpenCode/Claude Code, including OpenCode zai/glm-5.3-flash with variant max; runtime behavior is unchanged.
  • Development process. Deploy happens only when the owner runs make deploy; the deploy timer and make deploy-batch are gone. The changelog is assembled from docs/changelog.d/ fragments, the handoff keeps no shipped-work prose, docs/architecture.md is an index over docs/architecture/, and make adr seeds a decision record with a boundary line. Gates: internal/server tests run sharded across four processes, make ci runs its gates in parallel, make web is a no-op when nothing under web/ changed, and make close reuses a green ci-scoped for an unchanged tree.
  • Sidebar: selection without the blue bar. A selected agent or terminal card no longer paints the accent bar that read as a blue border around the card — selection is the tinted background plus the quiet border (the bar stays on *Needs you*, where it marks attention). The card's checklist chevron joins the card grid: the > now sits on the same column as the folder/branch icons below it (supersedes the 2026-09-06 own-gutter refinement), its text on the folder/branch label column, and expanded plan steps follow the same two columns.
  • User menu: llama.cpp in Tools. The desktop user menu's Tools group now lists llama.cpp (models, server connection and local service), matching the mobile More screen; it is searchable like every row. Previously the manager was reachable only through Providers or by URL.
  • Sidebar: PiCode without the build number. The version string (v0.1.0+…) no longer sits next to the name in the sidebar header; it still lives in the user menu.
  • User menu: one Tools group. After Providers, Settings and Packages moved under Agent CLIs, the leftover *Agents and connections* heading (Integrations alone) is gone. The desktop user menu and the phone's More screen list Integrations with Agent CLIs and Automations under Tools.
  • Desktop: one panel width for every page. All routes now share the Agent CLIs panel geometry — fluid up to 1240px, centred, same gutters. System, Integrations, MCPs, Devices, Preferences and Pins no longer use narrower centred cards (680px), and Automations, llama.cpp and Terminal defaults stop at 1240px instead of 1080px. Workspace surfaces (agents, terminals, files, git, apps) are unchanged.
  • Providers under Agent CLIs. Pi accounts, keys, quotas and verification now live in Agent CLIs → Providers, with a CLI selector and explicit machine scope. Old links and login shortcuts redirect; OAuth returns to the same desktop/mobile app. Failed catalog refreshes keep the current roster.
  • Packages under Agent CLIs. Pi package management and desktop package configuration now have explicit CLI and workspace/agent URLs. Old links redirect with their context, update indicators lead to Agent CLIs, and failed context reads preserve drafts while blocking stale writes.
  • Pins: the reminder picker is a form, not a menu of presets. Once — a date and a time; Repeat — every N hours, or every N days at a time of day (one day at a time is a wall-clock rule; several days count as a duration and say so), optionally counted from when you close the card. One Set, Remove beside it; opening starts from the rule that is set. The "morning hour" preference went with the presets. An interval may now name its first fire (at on PUT /api/pins/{id}/reminder), and its label says the time of day ("every 2 days at 18:30").
  • Mobile Work: workspace favicons match agent and terminal marks. The group head uses the same 24px slot and 22px glyph as the rows under it, so a project icon is no longer smaller than the CLI faces in the same list.
  • Mobile Work empty states sit in the well. Agents, terminals and workspaces with nothing to list center one line and a primary create button in the remaining space (muted icon, no essay); a search miss stays at the top with Clear search. Copy drops "free".
  • Sending a message to the terminal no longer toasts "Sent to the terminal." The user is looking at the pane and sees the message land — the confirmation was chrome talking to itself. The message bar/sheet closes over the visible delivery instead; toasts stay reserved for failures (send errors still surface via toastError). Both surfaces changed together: desktop bar (TermAttachBar.jsx) and mobile sheet (TermAttachSheet.jsx).
  • Settings now lives under Agent CLIs → Settings → Pi. Desktop and mobile retain global, trusted workspace, agent and key settings. Old links redirect; contextual URLs preserve the agent on reload. Native settings load independently of terminal setup, and failed saves retain edits.
  • Agent CLIs: one CLI combobox with favicons. Settings, Sessions and the new-terminal form share a --ctl-h combobox that shows each CLI's mark instead of an unstyled native select.
  • Development: the public docs site moved from www/ to docs-site/ — same VitePress build and GitHub Pages URL (cfpperche.github.io/picode/); the www/ name is reserved for the future product website. Make targets (DOCS_STAMP), CI workflows, scripts and living docs updated in the same commit; amended in place (owner-approved).
  • The dashboard counts every agent CLI, not just Pi. GET /api/sessions/stats now aggregates all six agent CLIs — Pi, Claude Code, Codex, OpenCode, Hermes Agent and Grok — so spend, activity, tokens, tools and turns describe the machine rather than one CLI. On the machine this was built on, the same 7-day window went from $517.04 to $1,916.35 — the old number was 27% of the truth, with nothing on screen to say so. Two new breakdowns ride along: byCli (which CLI the money went to) and coverage (what each CLI can and cannot report), plus code impact, timings and quota windows where a CLI records them. A metric a CLI never writes is reported as *not reported*, never as 0 — Codex is never given an invented price, and shows the quota window it does record instead (81% of a weekly limit, resetting Saturday, on the machine this was built on). Parsing is cached per file, so the minute-by-minute refresh costs 46 ms rather than the 2.4 s a full re-read would. A new ?scope=machine|picode narrows the window to folders a PiCode workspace claims; the default counts everything, as before.
  • The dashboard shows which CLI the money went to. A By CLI card ranks spend per agent CLI with a billing badge (api / sub), and four new panels read what the guest CLIs record and Pi never did: Code impact (lines added/removed, cost per line), Agent time (waiting on models vs. running tools — agent time, not elapsed, since sessions run at once), Limits (a quota window's headroom and reset), and Efficiency (cache hit, cost per turn). A What each CLI reports matrix shows the blind spots as data. A This machine / PiCode control narrows the window to claimed workspaces.
  • The dashboard never prints $0.00 for spend it could not measure. A day whose sessions are all still running has no price on disk yet; it now reads — with "not priced by any CLI that ran" instead of a zero that looked like "free". Sub-cent spend reads <$0.01, a plan-covered CLI reads "not priced", and a period with no activity says so instead of ranking six CLIs at zero.
  • Spend now lands on the day it was earned. A compaction marker is counted on its own timestamp instead of the session file's modification time, so a long-running session no longer dumps its whole compaction history onto the day it was last touched.
  • The desktop user menu follows the mobile v2 pattern: rows are grouped (Tools / Agents and connections / PiCode / Continue) and each carries a one-line description; a search field filters the menu with the same matcher as the phone's More screen; a no-match search says so with a Clear search action. Theme and layout radios stay in the menu; the install button and version hide while searching. Cites docs/benchmarks/2026-09-07-mobile-v2.md.
  • The workspace card's actions are two, not five: a New menu (agent, shell terminal, Agent CLI terminal) and one overflow menu holding Files, Git graph, Sessions and Remove workspace. Both triggers stay visible at rest — the old strip appeared only on hover, out of reach of touch — and the destructive action no longer sits beside the creative one. The menu hides Git graph on a folder that is not a repository and Sessions while the workspace has no agents, where the route answers 409. The empty state gained its two actions: "Empty — *add an agent* or *a terminal*". The card header stays one line: the rows under it already carry path and branch, so repeating them on the workspace was noise (owner's call, 2026-09-07). See docs/benchmarks/2026-09-07-workspace-card-toolbar.md.
  • Mobile v2: compact conversation and terminal controls, searchable Work views and grouped tools give more space to active work. Each agent keeps its unsent draft and attachments while navigating; message options open in a sheet and Enter adds a new line. Failed sends offer Retry.
  • Pi terminals no longer show a checklist strip above the pane. The TUI already draws the plan; the sidebar card still carries the one-line step. The pane is just the terminal.
  • Composer attaches a photo from this device. An image button next to the paperclip opens Photos, the camera, or a file picker. The paperclip still attaches a file from the agent's folder on the PiCode machine. Same caps as paste/drop: four images, 4 MB each.
  • Mobile extra-keys row no longer shows a vertical overlay scrollbar. Dragging the row sideways is pan-x only; the terminal screen, the row and xterm hide overlay scrollbars so iOS cannot paint a gray strip down the right edge.
  • Mobile extra keys no longer leave a black strip, and hide the TUI behind them. The phone shell fills the screen while the keyboard is closed. Opening it shrinks the terminal (and refits xterm) so the prompt stays above the extra-keys row; that row is opaque. Safari's undo/Done pill above the keyboard is the system IME — a web app cannot remove it.
  • Mobile extra keys sit above the phone keyboard. The terminal key bar is one horizontally scrolling row (esc, tab, ctrl, alt, arrows, Ctrl+C, then Home/End/pages and | ~ / -) that opens and closes with the software keyboard instead of a two-row Termux grid the IME could cover. The phone shell sizes itself to the visual viewport so the chat composer stays visible while typing. Sticky Ctrl/Alt are unchanged. The same row is available on an agent's Terminal view.
  • Loopback browser sessions end when the access ends. An auto-minted loopback browser session — the silent mint every browser on this machine gets, the headless QA fleet included — is revoked by a minute housekeeping sweep once its last authenticated request is 10 minutes old: a closed browser stops refreshing last_seen_at, an open one keeps the row alive even with Chrome's once-a-minute background-timer throttle. Each revocation is a session.revoked event, so open Devices views drop the row live; the daily prune deletes the rows a week later. Paired devices (phones, paired loopbacks) and the install token are never touched. The pile of offline "Headless browser" rows self-clears on the first sweep after upgrade.
  • Development process: make ci-scoped runs only the gates a branch's diff can break; make close ends a worktree session (scoped gates, regenerated OpenAPI/llms/captures, fast-forward check, closing summary); make worktree NAME=x hardlinks node_modules instead of npm ci; make worktree-gc removes merged, clean, idle trees; make docs-check warns on stale capture fingerprints instead of failing (--strict for the old gate); docs/handoff.md is capped at 100 lines by the pre-commit hook and per-session notes move to docs/handoff/; docs/screenshots/ is frozen (evidence stays in var/screenshots/).
  • Sidebar text column corrected for the smaller identity mark. The runtime-favicon resize shrank agent/terminal identity marks from 24px to 16px without updating the folder/branch line's (and, transitively, the checklist line's) left inset, so every row's .ws-context sub-line sat 8px right of its own title in production. Found while re-verifying the checklist chevron fix below against the deployed favicon change; the inset is now 23px (16px mark + 7px row gap) everywhere it is used.
  • Checklist chevron moved to its own gutter (owner refinement, follow-up to the compact-view alignment below). The disclosure's chevron sat in the same 31px column as the title/folder text, but a rendered icon's ink rarely touches its own bounding box the way plain text does — the owner spotted the chevron reading as offset from the title above it even though the boxes lined up. The chevron now sits in a dedicated gutter *before* that column (the tree-view convention: a leading disclosure mark, then the label), so the text of the checklist line and its expanded steps lands on the exact same column as the title, subtitle and folder/branch line, independent of the chevron icon's own inset. No JSX change.
  • Checklist compact-view alignment (owner refinement, docs/plans/ sidebar-checklist-expand.md). The counter drops its parentheses (5/8, not (5/8)) and moves to a fixed column at the row's end, the Linear/ GitHub sub-issue idiom, instead of prefixing the step text. The line and its expanded list now sit in the same 31px text column as the card's folder/branch line below it — previously flush left, out of the card's grid. The disclosure line's focus ring matches the row's own selection style (box-shadow) instead of a text-field-like inset outline. A finished plan (every step completed) dims to the same weight as a completed step, so it stops reading as open activity. The plan line moves above the folder/branch line on agent and terminal cards, matching identity → activity → location. Mobile's sub-line drops its parens too (5/8 · text). No server or domain change.
  • Identity favicons match the workspace favicon. Agent faces (sidebar rows, collapsed strips, editor tabs, inspector) and terminal CLI badges now render at the workspace favicon's 16px box with its 3px radius — natural image shape, no forced circular crop. Letter/glyph fallbacks keep the white plate for sidebar contrast; image faces stay full-bleed. Row indent (ws-meta) re-aligned to the smaller identity mark.
  • Checklist line refinements on cards. The (x/n) counter no longer wears the accent color — the operator line is one muted line. An absent checklist (the task required a plan and none was written) now renders as silence: no line, no "No checklist", on agent cards, terminal cards, the terminal pane strip and mobile rows. The data plane is unchanged — the absent marker is still published and stored.
Removido · 1
  • Mobile: the "Running" section is gone from the Now home; agents and terminals running stay visible with their state chips in the Work tab.
Correções · 54
  • Reloading no longer halves fullscreen mode. A reload always brought the mode's layout back but not the browser part — no gesture, so no fullscreen and no keyboard lock — and you had to toggle it off and on to get the keys back. Now the first click or keypress after the reload completes it on its own: the browser goes fullscreen again, the terminal keeps every key, nothing else changes. If the first gesture is Escape or the fullscreen chord, it does what it means (leaves the mode); synthetic input never triggers it.
  • Mobile: the Work tab no longer scrolls horizontally — the per-workspace action strip (Communication, Files, Git, +Agent, +Terminal) grew wider than a phone screen and pushed the whole page sideways; the actions now live in an "…" menu on each workspace row.
  • Prevent OpenCode from hanging when communication reconnects its native conversation; validate resumed readiness without overriding newer activity or permission requests.
  • Connect identified Codex conversations without restarting, and preserve their native identity when older launchers emit auxiliary completion notifications.
  • Preserve terminal dimensions during communication setup and recognize Claude Code's compact footer without requiring the browser panel to resize.
  • Communication now recognizes Grok 1.0.25's bordered input when delivering message and connection-test prompts. Drafts, unfamiliar layouts and prompts that would wrap remain protected.
  • A panel whose terminal or agent is deleted lets go of its screen at once instead of holding it until the cache trims, and keeps the name it was showing, so the row reads *shell · Gone — That terminal is gone.*
  • Pi connection setup shares its receiver registration, preserves native input and rejects stale process or conversation identity.
  • Communication preparation resumes the exact idle terminal conversation only after verifying the previous writer has exited; an unverified shutdown blocks replacement.
  • Managed Pi reconnect checks pending delivery, native commands and approvals before stopping. A stale stop cannot remove its replacement.
  • Sidebar: the plan (checklist) line's text starts on the card's left edge — same column as the title, subtitle and folder/branch icons — instead of floating ~16px right on a ghost indent.
  • Native conversation identity no longer falls back to the most recent session for enrolled terminals; daemon restart recovery verifies the current pane/process.
  • Prevent duplicate conversation addresses across /new and resume, stale activity reports, multiline draft submission, and attention starvation behind another recipient's backlog.
  • An explicit successful Messages refresh clears stale action errors while preserving history.
  • Codex lifecycle hooks remain active on resume/fork by placing their scoped overrides in the native subcommand.
  • Desktop: the default right-click menu (Copy, Paste, Reload PiCode, Toggle theme) again renders rows like the terminal context menu — icon and label together on the left, instead of the label pushed to the menu's right edge.
  • Creating two terminals at once on a machine with no tmux server running no longer fails one of them with "server exited unexpectedly": the daemon retries the tmux startup race for has-session and new-session.
  • The HTTP docs pair shells the way the server actually pairs. docs/api now shows picode pair (the old example called an endpoint that never existed) and no longer claims PICODE_INSECURE=1 skips pairing — that is the Who must pair: Off setting (PICODE_AUTH_MODE=off).
  • The architecture index renders as one table again on GitHub and the docs site (a stray blank line had broken it at).
  • Stale file path in the routes doc (web/src/lib/fileDocument.js → web/desktop/…, mirrored in web/mobile).
  • Development process. The pre-commit hook lets the release cut through (a CHANGELOG.md edit that adds a ## [x.y.z] heading) and parses staged changelog fragments so a malformed one fails at commit time, not at release. make deploy commits only the refreshed captures, never whatever else was staged. make adr allocates the number across every worktree even when run from inside one. The split architecture files link to docs/plans, docs/design and docs/benchmarks again. Capture tolerance is an absolute 128 px budget with the count printed per surface.
  • Pi terminal resumes use the recorded conversation file, including older session pins without resume arguments.
  • Communication setup preserves unrelated OpenCode inline JSON settings and MCP servers; malformed inline configuration blocks launch with an actionable error.
  • Sidebar cards: folder/git icons no longer crush on long paths. A deep workspace path flex-shrank the row's folder or branch SVG to a sliver; the label ellipsizes now and the icon keeps its 12px slot.
  • Sidebar checklist: no more undefined/undefined. Creating a plan in the same turn as a refused edit/bash posted an empty blocked marker that could land after the real list; the disclosure then concatenated missing numbers. Absent plans render as silence again; a parallel mutator no longer overwrites a plan this task already wrote.
  • Stable Agent CLIs layout. All tabs share the same page width, card padding and tab alignment. Switching to Packages no longer narrows the page; desktop scrolling keeps its horizontal space reserved. Sessions and CLI setup actions wrap within narrow screens.
  • Native settings recovery. Keep unsaved model patterns across temporary refresh failures, block stale writes until retry succeeds, and leave mobile agent settings and global key bindings usable when Pi defaults cannot be read. Desktop tool-mode restart failures stay visible as partial success and stop the sequence. Tools and Checklist menus now fit within the desktop viewport.
  • Pins: opening a pin with a heading or a list no longer restores an "unsaved" draft nobody typed. The editor normalizes the markdown it loads and announced that as an edit; loading is silent now.
  • Mobile: the Work list wears the workspace's project favicon. The workspace groups on the phone's Work screen showed a plain folder icon even when the project has a favicon the desktop sidebar displays. The group head now uses the same hasFavicon advertisement and /api/workspaces/{id}/favicon endpoint, falling back to the folder icon when the project has none or the file fails to load.
  • Schedules in a zone with daylight-saving time no longer hang the daemon. internal/cron's next-match search stepped the wall clock by hour and looped forever across the spring-forward gap (02:00 does not exist, so the step went backwards); it now steps by duration through the gap. Automations never hit it because the host zone has no DST; pin reminders in a named zone would have.
  • Web: CLI favicons no longer vanish on the dark theme. The dark-mode invert for transparent monochrome vendor marks was scoped to the Agent CLIs view only, so terminal rows in the mobile Work list and the desktop sidebar, tabs and inspector rendered black-on-dark. The rule now applies on every surface; Pi and colored raster fallbacks keep their native colors.
  • Pins: limits refuse instead of truncating, large screenshots can be annotated, an edited sketch shows its new picture, and two editors no longer overwrite each other. A title or note over the limit answers 400 with the limit spelled out (the studio counts the note near 100 KB) instead of a byte-sliced text that left invalid UTF-8 behind; tags are capped at 40 characters and whitespace folds to one -. Annotating an image keeps the picture by reference, so the drawing's 2 MB cap is about the drawing and a 6 MB screenshot annotates fine; the old "scene is required" message for that case is gone. Preview URLs carry the file's version, so re-saving a sketch changes its thumbnail and the picture in the note at once. Save sends the version it loaded and a 409 offers Reload instead of losing the other writer's edit; the studio retains an unsaved draft across navigation and reload ("Unsaved changes restored", Discard). A file dropped on a new pin names the pin after the file, never "Untitled", and Cancel offers to delete a pin created that way. The sidebar follows the change feed instead of refetching on every navigation, and the list no longer carries note bodies (nor do pin.created / pin.updated, which now share one summary shape). Sketch bytes are written atomically; a boot sweep removes attachment directories whose pin is gone; downloads keep accented names (RFC 6266). Pins v2 review: docs/plans/pins-v2.md.
  • Inbox: replies to ask_human questions asked from a terminal pi now actually reach the terminal. A pi running as an Agent CLI terminal filed questions as pi (unmanaged); the reply path only delivers to agent-sourced items, so replying marked the item done with a "Reply sent" toast while nothing was ever delivered. Terminal-sourced items now carry the terminal's identity and the reply rides that terminal's receiver back into the exact session that asked; failures reopen the item with the reply preserved. A blocking question from a source with no channel at all is now refused visibly and stays open — it can no longer be closed while nothing was sent. Requires pi-inbox 0.2.0 installed in the pi session (pi install -l …/packages/pi-inbox); items filed by 0.1.x as pi (unmanaged) must still be answered by hand.
  • Mobile: the installed web app's tab buttons sit as low as the platform allows. In standalone the tab content was centered in a 56px bar that ends at the (shortened) layout viewport, leaving ~11px of dead nav below the labels on top of WebKit's unreachable strip; the content and its pill now anchor to the bar's bottom edge there. The standalone detection also measures instead of assuming (screen height vs. visual viewport; WebKit 317153 reports the behavior varies with the iOS generation and the icon's install date), so edge-to-edge installs keep their real insets. An opt-in probe, opening the app with ?strip-probe=1, extends the shell into the unreachable strip to test whether element painting survives — if labels survive at the screen's physical bottom, that offset can become the default; if they are clipped, the answer is no. Preferences → Layout now exposes that extension as the user's own Screen edge choice (clipping risk stated in the option label).
  • Mobile: the active-tab pill covers the label, and the installed web app no longer shows a dead band above the home indicator. The active pill used to hug the icon only (28px tall) and its bottom edge cut through the label's first two pixels; it now sits behind icon + label as one surface. On iOS home-screen installs (standalone), WebKit parks a status-bar-sized strip *below* the layout viewport that no element can reach and still reports env(safe-area-inset-bottom) inside it — a double count that wasted ~81pt under the tab bar (WebKit bugs 313800, 254868). The shell now flags iOS standalone at bootstrap (navigator.standalone), treats the bottom inset as already reserved (Safari and Android keep real insets), and paints the canvas so the unreachable strip continues the surface it sits under — the tab bar's panel on tab screens, plain content on pushed screens — instead of a black band. Recovers the 34pt of doubled inset for content.
  • The dashboard's reliability numbers were wrong for every guest CLI, and said otherwise. Claude Code showed 0 errors against 409 real ones (a tool's failure comes back on the *user* turn, which the counter skipped), 45 aborts that never happened (a normal stop_sequence was read as one) and none of its 4 refusals; Codex showed 620 prompts against 455 (its own AGENTS.md injections were counted as the person's); a week of Claude Code showed 42 sessions where 30 ran (subagent transcripts counted as their own). The "What each CLI reports" matrix now derives from what the parser actually saw instead of a per-CLI claim, and the tests parse real lines from each CLI's store.
  • A prepared command no longer swallows the next one. A git command typed into a terminal and never submitted stayed on the prompt; the next one landed glued to its end and the shell answered fatal: only one reference expected. The line is cleared before anything is typed — for the Inspector rail's Git menu as well as the graph's. Stated plainly: anything you had typed at that prompt and not submitted is discarded, where before it was corrupted.
  • Undo never composes reset --hard over work you just made. Undoing a commit uncommits it and leaves the changes staged; undoing a merge, rebase, pull, cherry-pick or revert moves the branch back with --keep, which refuses rather than lose a local change. A hard reset is offered only to undo a hard reset.
  • A git action that could not be sent no longer reads as sent. A busy repository or a moved terminal keeps the form open with the reason; the graph does not wait for a change that was never asked for.
  • A worktree created from inside a worktree is a sibling, not a child. The command names <repository>/.worktrees/<name> absolutely instead of a path relative to wherever the terminal sat.
  • Branches of a second remote work. upstream/feat-x is fetched from, pulled from and deleted on upstream, not refused as "not a branch".
  • Keyboard focus stays inside a git action form that has no field of its own (merge, fetch, rebase…); it landed on the page behind before.
  • The graph's "waiting" line no longer spends its patience while the tab is hidden, and when it does give up it shows the repository as it is now.
  • Browser-tab icon is back on /desktop/ and /mobile/. Since the desktop/mobile split (2026-09-05) the app pages linked the favicon, Apple touch icon and PWA manifest under the application path (/desktop/favicon.svg), where nothing is served — tabs fell back to the browser's placeholder icon and the manifest 404'd. The three brand links now keep pointing at the site-root files (as intends), and the build enforces it.
  • Reloading no longer announces every agent that was already waiting: the needs-you pass could not tell "nothing is waiting" from "nothing has been read yet", so it seeded from the first render's empty fleet and the first real answer looked like a fresh arrival — a reload with three blocked agents raised three sticky cards on top of the badges that already said so. The pass now waits for the fleet to have been read once. A question that arrives while you are looking still announces itself, which is the whole point of the card.
  • Agent CLI attachments no longer dirty the project's .gitignore or pile up forever: attaching an image or file to a Claude Code/Codex/ Grok/Hermes/Pi terminal used to append a silent, uncommitted .picode/drop/ line to the project's own tracked .gitignore on the first attach — showing up as an unexplained M .gitignore in git status — and did nothing at all in a project with no root .gitignore, leaving every staged attachment fully untracked. A nested .picode/.gitignore now covers the folder unconditionally, without touching the project's file either way. Staged attachments older than 7 days are also swept the next time anything is attached in that project — nothing removed them before.
  • Terminals reattach after a phone lock: locking the phone (or any network drop) no longer leaves a dead "— detached —" terminal that must be exited and reopened, losing the reader's place. The browser reattaches automatically — backoff 1 s → 10 s for up to ~95 s per burst, an immediate retry when the app becomes visible or the network returns — keeping the same xterm pane; tmux preserves the copy-mode scroll position across attaches. A tmux session that is truly gone says "Session ended. Reopen the terminal." once, and heals by itself if the session comes back.
  • Mobile recovery: partial fleet failures preserve prior results; stale session responses cannot replace the newly selected CLI. A CLI diagnostic such as "No models available" no longer appears as a provider/model. Automation actions reject duplicate taps and restore rejected toggles; session handoff keeps controls locked through a confirmed retry and shows execution failures inside its sheet.
  • New Agent CLIs get Activity reporting on. A CLI added to the catalog no longer imports with the switch off because it was missing from enabled.json. OpenCode rows frozen that way are turned on once at boot. Opening an OpenCode terminal prints Starting OpenCode... until the TUI draws, so the pane is not a blank cursor.
  • llama.cpp setup recovery: failed or interrupted initial setup removes only its recorded empty folders, preserving existing or unexpected content. Unreadable ownership proof retains the recovery record until access is restored.
  • Phone terminal: extra keys stay off until you open the keyboard. Opening a terminal no longer focuses xterm on attach, so iOS does not show the extra-keys row without the phone keyboard. The header keyboard button lets that tap summon the IME. Pinning the shell to the visual viewport requires a real shrink against the unfocused baseline, so a rest-state gap no longer leaves a black strip under the TUI.
  • Update checks failed on real installs: install-method detection now resolves symlinks (~/.local/bin/claude → the native versions dir) and reads wrapper scripts (Hermes Agent), so update/reinstall/uninstall controls appear for actual installs instead of "No managed lifecycle".
  • Owned llama.cpp model cleanup now recognizes verified Hugging Face cache downloads even when the router omits file paths. It records the exact blob and snapshot link, validates their hashes and refuses shared or changed files.
  • GitHub CI on macOS: the worktree test compares symlink-resolved paths (/var → /private/var), and the terminal run/type routes validate the request (404/409) before asking for tmux (503), so the matrix is green without tmux installed.

0.1.0

5 novos

Novo

  • Project bootstrap: public repository, MIT license, CI (GitHub Actions with gofmt/vet/test/build across linux/macos/windows), Makefile.
  • Living documentation system: docs/ with architecture, philosophy, engineering + UI/UX benchmarks, handoff (docs/handoff.md) and ADRs (docs/decisions/) — with an explicit contract that documentation evolves with the code (see AGENTS.md).
  • Pi agent harness: root AGENTS.md (operating contract), quality skills in .pi/skills/ (quality-gate, uiux-review, handoff-update) and project settings in .pi/.
  • Go server skeleton: picode binary with UI embedded via go:embed, /api/health and /api/version endpoints, dark-first placeholder page with a live health check.
  • Initial decision records (ADRs): browser app served by a single Go binary (0001), dual-channel tmux+RPC agent control (0002), dependence on user-installed pi (0003).