Skip to content

Releases: mainsdotdev/mains

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 14 Sep 12:54
95ee7da

Mobile is here.

0.8 made a run survive the workspace you left. 0.9 made a space say what it was for. 0.10 removes the last thing tying you to the chair: a run waiting on an answer only reached you if you were sitting at the Mac. Mains is two apps now. The Mac still runs the agents, and an iPhone pairs with it over a QR code to drive them. You can approve a tool, send the next prompt, and read the transcript from wherever you are.

📖 Full write-up: Mains 0.10: Mobile is here

Pairing is a QR code and a token

  • Settings → Relay → This machine shows a QR code. The phone scans it and is paired.
  • The pairing code is short-lived. It lives only in memory, expires after five minutes, and works for a single exchange.
  • The device token is what stays. It is stored securely on the phone, and only as a hash on the Mac. Revoke a device and its live connection is dropped immediately, not at the next reconnect.
  • The phone reaches the Mac over the network, on your LAN or through Tailscale HTTPS. If the camera isn't available, you can copy the pairing link instead.

What a paired phone is allowed to do

  • Everything is an allowlist. The phone can read runs, turns, tool calls, artifacts, context, workspaces, branches, diffs, projects, collections, spaces, providers, models, skills, and slash commands.
  • It can change seven things. It can answer an approval, continue, start, fork, or stop a run, change a space's mode, and adjust the composer's run settings. Each command carries an id, so a retry on a flaky connection never runs twice.
  • Files, git, the terminal, and settings stay on the Mac. Provider configuration reaches the phone without API keys or URLs, and only an allowlisted set of events is pushed to it.

The phone keeps its own copy

  • A local database on the phone holds spaces, collections, workspaces, runs, turns, tool calls, artifacts, and pending approvals. It opens on cached state, even offline.
  • Data flows one way, from the Mac to the phone, so there is nothing to merge. Reconnects fetch only what changed since the last sync.
  • The connection is managed outside the UI. While offline it waits for the network instead of burning battery on retries. It rotates through the Mac's addresses when one fails, and tells you plainly when a token is refused or the versions don't match.

Answering the agent from the couch

  • Approvals arrive as cards that mirror the desktop dialogs. You can allow or deny a tool, pick an option or type an answer to a question, or open and accept a URL. A request stays in the app until it's answered.
  • The transcript renders like the desktop one. It uses the same tool-call renderers and Mains typography. Images the agent produces open in a full-screen viewer with zoom and a share sheet.
  • Model, effort, permission mode, and fast, goal, and plan switches are all on the phone, wherever the provider supports them.
  • Search covers everything on the Mac at once: chats by title or project, workspaces by name or branch.

Data sharing is asked for, not assumed

  • Before a prompt goes to a provider, the phone asks. It names the service and who receives the data (OpenAI for Codex, Anthropic for Claude Code, GitHub for Copilot, Anysphere for Cursor) and links the privacy policy.
  • Consent is tracked per Mac, per provider, and per disclosure version. A new Mac, a new provider, or a changed disclosure asks again. Grants live in Settings → AI Data Sharing on the phone.

What the phone can't do yet

  • iPhone only for now. Android is planned.
  • No push notifications yet. Approvals wait in the app until you open it.
  • No terminal, file browsing, git actions, or diff viewer. Workspace rows show the branch and diff size only.

On the desktop

  • Bash approvals show a readable command preview, with the shell, working directory, and timeout when the agent sets them.
  • File edits waiting for approval show a real diff instead of raw tool input.
  • Provider sign-in runs in its own terminal. It is scoped to the login command and doesn't need a workspace.
  • Math renders. LaTeX in replies displays as proper equations on both the Mac and the phone.
  • Rotate the backend token from Relay. Clients using the old token are disconnected.
  • Every WebSocket host bind requires a pairing token, loopback included. The image proxy requires one too, serves only images, and sends security headers.
  • Run attachments are validated. Unsafe filenames and paths outside the upload directory are rejected.

Smaller things

  • Codex can resume runs that never picked a model, falling back to the provider's default.
  • A live run refuses a second prompt, and Enter in the editor no longer slips past that.
  • An emptied composer no longer sends a stray newline.
  • Work mode now tells the agent that web search and web fetch are available and allowed.
  • Space and collection icons live in one shared package, so both apps show the same set.
  • The repository is now a monorepo: apps/desktop, apps/mobile, and a shared packages/contracts for the wire protocol both apps speak.
  • Building from source now requires Node.js 22.12 or newer. CI and releases run on Node 24.

Platform: macOS only (Apple Silicon and Intel). The iOS app ships through TestFlight while it is in App Store review.

Full changelog: v0.9.0...v0.10.0

v0.10.0-preview.20260914

Pre-release

Choose a tag to compare

@github-actions github-actions released this 14 Sep 12:03
a600fdd

What's Changed

  • chore(ci): sync PR body follows the squash-then-reset promotion model by @OkanBilal in #99
  • feat(repo): restructure into a monorepo — desktop, mobile, contracts by @OkanBilal in #100
  • chore(release): v0.10.0-preview.20260914 by @OkanBilal in #101

Full Changelog: v0.9.0...v0.10.0-preview.20260914

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 25 Aug 07:39
f3b93c4

Code, Work, Chat.

Every space in Mains used to answer one question: which agent runs underneath it. 0.9 adds a second one — what you're here to do. A space now has a mode, and the mode reshapes both the app around the agent and the rules the agent works under.

📖 Full write-up: Mains 0.9: Code, Work, Chat

Three modes, one picker

  • Code, Work, Chat — at the top of the sidebar. Code is everything Mains has been: repos, branches, diffs, terminal. Work is the same agents pointed at documents, reports, and digests, with the git machinery gone. Chat is a conversation that cannot modify anything.
  • Mode belongs to the space, not the app. A Code space and a Chat space sit side by side in the sidebar and behave completely differently. ⌘1, ⌘2, ⌘3 switch between them.
  • Claude and Codex offer all three. Copilot and Cursor stay on Code for now — their harnesses don't yet give us the levers the other two modes need.

The app changes shape

  • Work drops the developer ceremony — no git actions, no terminal, no Changes tab, no permission dropdown. Files and Activity stay, because in Work the deliverables are files.
  • Chat goes further and removes every write-adjacent control, keeping Files for reading.
  • The sidebar follows. Code lists workspaces under Add Project; Work and Chat list chats under New chat, grouped into collections. Model, effort, thinking, and fast mode stay in all three — those are about the engine, not the experience.

So does the agent

  • Each mode carries a harness — a prompt delta, a tool policy, and provider settings — resolved once, when a run starts. Code is untouched; until a space opts into Work or Chat, the harness isn't there.
  • Work takes Bash away and accepts edits by default. Its prompt asks for plain language over tool names — "scanning the folder for documents", not "running grep" — and for finished files rather than fragments in chat. On Codex, the tone comes from Codex's own friendly personality, applied natively.
  • Work's accept-edits is a default — a choice you make in the composer still wins. Chat's read-only is an override — nothing a client asks for can turn a Chat space into a writing one.

Collections

  • What projects are to Code, for Work and Chat — a name, an icon, a set of chats, and a set of sources: files you add or text you paste. No git repository required.
  • Sources travel with the run. When a chat in a collection starts, resumes, or forks, the current sources are copied into that run's own working tree and recorded with their content hash. Move a chat to another collection and its next turn sees the new sources; nothing that already happened is rewritten.
  • Created and edited right from the sidebar, with an icon picker that takes an emoji or any of the built-in icons in any tint. Chats can be renamed inline from the same menu.

Documents open inside Mains

  • Word, Excel, and PowerPoint files render in-app. Markdown renders with Mains' own typography, with working section links and task-list checkboxes.
  • Save a copy… opens a native save dialog and puts the document wherever you actually want it. Files the agent writes live in the run's directory until then.

Pulses for Work and Chat

  • Pulses carry a mode, and templates declare which modes they belong to. The original, git-centric templates stay in Code. Work gets a set built around documents — Daily document digest, Weekly report draft, Meeting notes cleanup, Executive one-pager. Chat gets read-only briefings — Daily briefing, Weekly recap, Devil's advocate pass, Plain-language explainer.
  • Neither needs a workspace. They run on their own, and can point at a collection, whose sources travel with them.

Git stays in your hands

  • The agent's own commit and pull-request tools are gone. Commits and PRs go through the git actions panel — yours to trigger, with the diff in front of you — or through the shell, if you explicitly ask the agent to. What's left of Mains' own tools is reviews and package checks, and those exist only in Code.
  • Worktrees are off by default on fresh installs. New workspaces work directly in the repository unless you turn worktrees on in Settings → Git. If you'd already made the choice, nothing changes.

Smaller things

  • Every workspace now belongs to exactly one project, enforced at the database level. Older installs are backfilled by the migration.
  • Removing a project runs the full cleanup — provider sessions and worktrees included — instead of a cascade that left them behind.
  • Sidebar icons are mode-aware, and a space's mode can be switched from the sidebar directly.
  • A much larger icon set for spaces and collections, with the same picker everywhere an icon is chosen.
  • Onboarding gains a tour of the core features, and Linear issues open with their full detail in the tasks inbox.
  • Archived runs show the project or collection they belong to, can be searched, and can be deleted for good.
  • Codex's personality is now a setting. Work and Chat set it to friendly for you.
  • Markdown in replies got stricter: inline code and code blocks render distinctly, task lists render as checkboxes, and #section links scroll to the section.
  • Codex runs no longer send a model when you haven't chosen one, so the CLI's own default applies.
  • Untracked binary files no longer trip the git snapshot.
  • The composer hint says plugins, matching what the command actually lists.
  • Under the hood: Electron 41.10, Vite 8, updated Claude and Copilot SDKs, and a renderer startup budget — onboarding and the terminal now load lazily.

Platform: macOS only (Apple Silicon and Intel).

Full changelog: v0.8.1...v0.9.0

v0.9.0-preview.20260824

Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Aug 15:44
ccbc53e

Preview build heading for 0.9.0. The auto-updater does not serve previews —
stable installs stay on 0.8.1, so this is a manual download.

What's in it

Nearly all of it is one PR (#93) — the largest change since the workspace refactor.

  • Modes. Every space now drives one of three experiences: Developer (the coding agent as before), Work (a knowledge-work collaborator — plain language, deliverables as files, no shell, no git ceremony), and Chat (read-only conversation — the agent can read and search but cannot change anything, enforced at the provider, not just in the prompt). The picker sits at the top of the sidebar. Claude and Codex offer all three; Copilot and Cursor stay Developer-only for now.
  • Collections. Work and Chat runs need no repository. They group under collections (labelled "Projects" in the sidebar) that carry file and text sources — attached once, delivered into every run of the collection, including resumes and forks.
  • Pulses know their mode. Developer pulses target a workspace; Work and Chat pulses run without one and may target a collection. Templates are filtered per mode.
  • Git leaves the agent's toolbox. CommitChanges, CreatePR and GetWorkspaceDiff are gone; commits and PRs go through the git-actions panel, or the agent's own shell. Code review is Developer-only.
  • Around the edges: an onboarding tour of the core features; "save a copy" in the document viewer, with markdown rendered natively; Linear issue detail in the tasks inbox; chat renaming and recent chats in the sidebar; usage ticks instead of the rate-limit bar; archived runs show their project or collection and can be deleted for good; file-writing tool calls stay visible instead of collapsing into the accordion; 30+ new space icons.
  • Underneath: Electron 41.10, Vite 8, and the Claude and Copilot agent SDKs bumped (#93, notices refreshed in #94); a renderer startup budget, with onboarding and the terminal lazy-loaded; a new DMG; the bundled Copilot media-remote adapter is stripped from the package — it was failing notarization.

Worth knowing before you install

  • Six migrations run on first launch (runs.mode, collections, pulses.mode, …) and they do not roll back. Every workspace is now bound to a project — orphans are backfilled. Back up ~/Library/Application Support/mains/ if you want a way back to 0.8.1.
  • Worktrees default to off for fresh installs; existing installs keep their setting.
  • A run keeps the mode it started in, even if you switch the space's mode later.

If something breaks, open an issue — that is what this build is for. Mode switching, collections with sources, and the migration over an existing database are the places to look.


Platform: macOS only (Apple Silicon and Intel).

Full changelog: v0.8.1...v0.9.0-preview.20260824

v0.8.1

Choose a tag to compare

@github-actions github-actions released this 21 Aug 08:02
85432f2

Four fixes on top of 0.8.0. No new features.

0.8 was about runs you start and then walk away from. This is the pass over the things that got in the way while you were away: a transcript that scrolled through black gaps, a task bar that outstayed its purpose, a warning nobody could act on, and a changed-files count that disagreed with git.

Scrolling a long transcript is smooth again

  • The black gaps while flinging past older turns are gone. Historical rows carried content-visibility: auto, so each one was laid out as it entered the viewport — a frame that missed its deadline showed the container's background instead of the row.
  • The containment also cost more than it saved. Measured in the packaged app against a real 17-turn transcript — 33 rows, ~12k elements, 20 viewports of scroll — it ran ~25% heavier per frame on average and nearly double on the worst frame. Without it: 7.5–8.2 ms average against a 16.7 ms budget, and zero blank frames per fling, across three repeats.
  • React.memo on the group components and the structural sharing in the row builder stay — they were doing the actual work.

The task bar steps out of the way

  • It renders only while a step is still in progress or pending. "Task 6/6 · All tasks completed" used to keep floating over the transcript for the rest of the run — covering the text you were reading to say nothing you could act on, and expanding over it on hover.

Rate-limit noise stays out of the transcript

  • Only a rejection reaches the transcript now. Once usage got high the Claude SDK emitted an allowed-warning every turn, and each one became an orange "Approaching rate limit" row — two per exchange, one before the answer and one after. A percentage is not something you can act on mid-run; the turn that actually gets stopped still says so.

The changed-files count follows git again

  • A run's diff is anchored to HEAD, not to the sha the run started from. Work the agent committed mid-run stayed inside the stored diff, so the sidebar and the changed-files panel kept counting changes that were already in history while the session panel — which reads live git status — had moved on.
  • The old guard only fired for the CommitChanges tool, so a git commit run through Bash, or one made in a terminal outside the app, went unnoticed. Snapshots now read HEAD per capture, falling back to the run's base ref only when HEAD is unreadable.

Platform: macOS only (Apple Silicon and Intel).

Full changelog: v0.8.0...v0.8.1

v0.8.0

Choose a tag to compare

@github-actions github-actions released this 19 Aug 08:53
e4acd04

Leave It Running.

0.7 put issues and pull requests on one screen. 0.8 is about the runs themselves — the ones you start and then walk away from. A run in another workspace is no longer out of sight, the git panel covers the half of the workflow it was missing, and the context window is something you can read instead of guess at.

📖 Full write-up: Mains 0.8: Leave It Running

Runs you left behind, still on screen

  • A deck above the sidebar footer — the newest run face-up, the rest as edges peeking above it. Hover and the deck fans open.
  • Each card carries what you need to triage it — the workspace it belongs to, how long it has been running, and its last line of activity, so a run that is thinking reads differently from one that is stuck.
  • Click to jump straight back in, or stop the run from the card if it has gone the wrong way. The dock renders nothing at all when everything live is already in front of you.

The git panel pulls now

  • Pull is a single row — fast-forward only, with the behind count next to it. No form, because a pull takes no input; if it cannot fast-forward, git's own wording tells you why and nothing changed.
  • New branch forks off the checked-out one without stashing first — uncommitted changes come with you, and the workspace's pull request base moves to the branch you left.
  • Pick the pull request base in the form — the generated description is written against that base, not against a diff you are not opening.

Where the context window actually went

  • The meter is a ring broken into categories — system prompt, system tools, memory files, skills, messages — each holding its color for the life of the run, so a category you are watching does not change hue every time something else grows past it.
  • Hover for the full breakdown, including the parts that are not yours: free space, the buffer auto-compaction keeps in reserve, and schemas the provider deferred.
  • Amber, then red, as the fill gets serious — the number and the arc always agree on the state.

Set it to the size you actually read

  • Two sliders in Settings → General. Interface rescales the whole app — text, spacing, every dimension — from 12 to 18.
  • Code is separate and stays in pixels, 10 to 18, driving the diff viewer and every code surface, because the size you review a diff at is not the size you read a sidebar at.
  • Inter ships inside the app rather than being fetched, so it renders the same on every machine, first launch included.

Space colors, everywhere they belong

  • The theme color reaches the composer glow and your own message bubbles, so a space reads as itself while you are typing in it, not only at the edges.
  • Override the theme per space when you want a different one. Surfaces with no usable color fall back to exactly what they looked like before.

Smaller things

  • A real About window — version, Electron, Chromium, Node, macOS, and architecture — replacing the stock system dialog.
  • Search in the connection wizards. Typing dev mains finds mainsdotdev/mains; every token has to match, in any order, so you do not have to guess how a provider separates owner from name.
  • Codex plugins now say why they cannot be installed — disabled by an administrator, not available on your plan (with the eligible plans listed), or a required app is unavailable — instead of an install that quietly does nothing.
  • Claude's permission mode agrees with itself. The default lived in four places that had drifted apart, and the settings screen claimed a different mode than runs actually used. New installs start on auto; a mode you already chose is left alone.
  • Codex messages no longer show streamed citation markers in the text or in reasoning output.
  • Keyboard navigation continues correctly after a dropdown or modal closes, and buttons, tabs, dropdowns, modals, and form controls carry proper labels and roles throughout.
  • Diff rows keep their red/green tinting under the new surface styling, test files get their own icons in the explorer, and the error boundary got a rewrite.
  • Previews are now cut from dev and published as prereleases — visible on GitHub, invisible to the auto-updater, so stable stays stable.

Platform: macOS only (Apple Silicon and Intel).

Full changelog: v0.7.0...v0.8.0

v0.8.0-preview.20260817.2

Pre-release

Choose a tag to compare

@github-actions github-actions released this 17 Aug 17:19
87ea993

Second preview of 0.8.0, superseding v0.8.0-preview.20260817. The auto-updater
does not serve previews — stable installs stay on 0.7.0, so this is a manual download.

New since the first preview

  • Background runs in a sidebar dock — live runs across every workspace, with elapsed time and last activity, one click back to the run (#77)
  • Pull workflow, workspace branch creation, and selectable PR bases (#79)
  • App surface polish, plus resource and message rendering (#80)
  • Space theme colors in the composer and user message bubbles (#81)

Carried over from the first preview: the workspace architecture refactor and accessibility pass (#74), and the two-channel release pipeline (#75).

If something breaks, open an issue — that is what this build is for.


Platform: macOS only (Apple Silicon and Intel).

Full changelog: v0.8.0-preview.20260817...v0.8.0-preview.20260817.2

v0.8.0-preview.20260817

Pre-release

Choose a tag to compare

@github-actions github-actions released this 17 Aug 05:50
b3de45f

Preview build heading for 0.8.0. The auto-updater does not serve previews —
stable installs stay on 0.7.0, so this is a manual download.

What's in it

  • Workspace architecture refactor, plus an accessibility and UI consistency pass (#74)
  • Release pipeline split into two channels: previews cut from dev, stable promoted to main (#75)

Mostly internal groundwork; the visible part is the workspace UI pass.

If something breaks, open an issue — that is what this build is for.


Platform: macOS only (Apple Silicon and Intel).

Full changelog: v0.7.0...v0.8.0-preview.20260817

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 14 Aug 13:32

Triage, Review, Merge.

0.6 was about working alongside the agent inside one workspace. 0.7 is about everything waiting outside it — issues and pull requests on one screen: read the diff, comment on a line, resolve the thread, and merge, without opening a browser tab.

📖 Full write-up: Mains 0.7: Triage, Review, Merge

One inbox for issues and pull requests

  • Tasks is a new screen in the sidebar — two tabs, a shared search and filter bar, and a detail pane that stays open beside the list. Drag its left edge to resize; the width survives restarts.
  • Issues moved out of the workspace sidebar — they used to compete for room with the file tree and the run history. The workspace is for the run you're in; Tasks is for everything waiting on you.
  • Facet filters with counts — connection and project for issues, state and repository for pull requests, tucked behind one button so the list keeps its space.

Pull requests that are actually current

  • Live, never stored — CI status, mergeability, and review state go stale faster than any sync interval can chase, so the inbox asks GitHub each time and keeps nothing.
  • Rows you can triage from — state icon, CI dot, author, branch, diff stats, and when it last moved. Relationship — All, Review requested, Reviewed, Authored — stays visible as tabs.
  • Scoped to your repos — search defaults to the repos selected on the connection (the same set issue sync pulls from), and falls back to a global involves:@me search when none are selected.
  • No gh dependency — search, detail, diffs, and every write go through GitHub's GraphQL API with your stored connection token.

The whole pull request, in the drawer

  • One pass over the PR — branch, reviewers, comments, checks, and status, with the description rendered as real markdown and every review thread listed under it.
  • Checks summarize and expand3 passing · 1 failing, opening into the individual runs.
  • Merge is a split button — the left half runs the method you picked, the chevron switches between merge, squash, and rebase. On a draft, that slot becomes Ready for review.

Comment on the line, not about it

  • The Code tab is a full file-by-file diff — truncated at a file boundary past 300k characters, so a huge PR still opens.
  • Inline review comments — hover a line, click the + in the gutter, and what you write becomes a review thread on GitHub, on that exact line.
  • Threads stay in place — already-open threads are anchored to their lines, so you can reply and resolve without leaving the diff.

Sign in to GitHub without making a token

  • OAuth device flow — connecting GitHub no longer starts with minting a personal access token and guessing at scopes. The wizard offers Sign in with GitHub: a one-time code, an approval in your browser, done. The token tab is still there, and both paths end in the same stored credential.
  • Provider-agnostic — the credential step now supports an alternative sign-in tab per provider. GitHub is just the first user.

Platform: macOS only (Apple Silicon and Intel).

Full changelog: v0.6.0...v0.7.0

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 11 Aug 10:42

Edit, Commit, Ship.

0.5 was about watching an agent work. 0.6 is about working alongside it — edit files without leaving the app, generate commits and PRs from the diff you're already reading, and see exactly which agent did what.

📖 Full write-up: Mains 0.6: Edit, Commit, Ship

Work alongside the agent

  • The code viewer is an editor now — open any file from the tree and type. No round trip to your IDE for a one-line fix. Saves are conflict-guarded: if the file changed on disk underneath you, you get Reload, Overwrite, or Retry instead of a silent clobber.
  • File explorer search — type to filter the whole workspace by name or path. In a git repo, git decides the candidate set, so everything .gitignore ignores stays out of the results (VS Code parity: the tree shows dotfiles and build output, search doesn't crawl them). Falls back to a broad exclude list outside git.
  • 30 new file-type icons — Python, Rust, Ruby, Go tooling, Docker, Drizzle, Tailwind, Vite, Vitest, GraphQL, and more.
  • Every subagent visible — subagents get their own panel and an agent glyph: a small symmetric mark whose pattern and color are hashed from the agent's identity, so the same agent looks the same everywhere. Status reads at a glance — twinkling while running, a check when finished, a cross on failure, a stop mark when halted.
  • Task summary pill — the task summary is now a floating pill at the top of the transcript: spinner, Task 3 of 7, and the step being worked on right now.

Commit and ship

  • Git actions in place — commit and PR panels expand as accordions, so you never lose the diff you were reading. They're mutually exclusive and close themselves once their row goes unusable. Commit / push / create-PR show a loading toast that survives closing the panel and swaps in place for the result.
  • ✨ Generate buttons — fill the commit message and PR title/body on demand. Generation uses a fast one-shot model rather than your chat model, so it costs neither your context nor your good tokens — and the wait drops from ~10–20s to a few seconds.
  • No surprise staging — commit-message generation has a preview mode that summarizes staged + working diffs without staging as a side effect.
  • Untracked files in diffs — workspace diffs now persist untracked files (migration 0009).
  • Bigger generation context — up to 100k characters of diff, with truncation explicitly flagged so the model knows it's seeing a prefix.

Agents

  • One-click provider sign-in — when a provider CLI isn't authenticated, a notice appears above the composer and inline on auth-failed runs. Sign in opens the bottom terminal and runs that provider's login command for you.
  • Faster Claude account detectionclaude auth status --json is tried first, so a signed-out state is detected definitively without spawning an SDK query.
  • Codex thread lifecycle — archive, unarchive, and delete Codex threads, wired through the app-server protocol.
  • Better provider defaults — default models resolve from live catalogs, with provider-specific reasoning and effort defaults for Claude and Codex.
  • Sturdier lifecycles — improved run, session recovery, task, and subagent handling.

UI

  • Screenshot galleries — consecutive image artifacts group into a single gallery of compact tiles, so a verification pass reads as one result instead of scrolling you off the page. Actions, previews, and open-in-app menus are preserved per tile.
  • Model picker — improved layout, submenu positioning, and pointer-travel behavior.
  • Write tool — file creation gets its own icon and a "Wrote" verb, no longer borrowing Edit's.
  • Refreshed diff rendering via @pierre/diffs 1.3.5 and shiki 4.4.2.

Security

  • Remote images are click-to-load — an auto-fetched remote image is a data-exfiltration beacon: a prompt-injected agent can encode your data into an image URL, and the fetch itself is the leak. Remote sources now render as a click-to-load placeholder; local sources (data:, app capture schemes, workspace paths) render as before.

Fixes

  • Codex/Cursor "already has an active writer" — writing provider settings used to rebuild the cached adapter, spawning a second app-server alongside the first while it still held thread writer locks, so resumed runs crashed. The factory now refreshes the live adapter's config in place.
  • Packaged-app PATH — the packaged app adopts your login-shell PATH, so git hooks and version-manager binaries resolve (fixes husky failing with env: node: No such file or directory on commit).
  • Plugin details — the plugin page falls back to the cloned marketplace manifest when the catalog cache hasn't indexed an entry yet, and gained Installs / Updated / Source rows.

Platform: macOS only (Apple Silicon and Intel).

Full changelog: v0.5.0...v0.6.0