Repository navigation
Releases
v0.1.129
Release covering all 323 commits since v0.1.128.
Providers and agent control
- Add Antigravity (agy) across desktop, daemon, headless, web and mobile, including model discovery, installation, updates, readiness and branding. Thinking-tier models display their base names.
- Add Claude Fable 5.2 and Muse Ember support.
- Add per-session effort, Fast mode and steering for fx.
- Add Update all for outdated provider CLIs in Settings → Providers.
- Reopen saved chats with CLI
chat presentand MCPpresent_chat, preserving identity, transcript and settings. - Queue agent prompts sent to busy threads. Claude steering reaches busy agents promptly; back-to-back steers no longer fail the run, and the daemon retains turns during active steering requests.
Desktop
- Open file links at their referenced line, with configurable Verde, system-default or Neovim targets.
- Improve consistency across chats, panes, sidebars, settings and the Companion; keep the Companion clear of chat controls and workspace panels.
- Stopping a restored, unverified background task now ends its row.
Live voice
- Mobile calls continue in the background and the floating call bar stays available across the app until the call ends.
- Move audio setup off the UI thread; fix Android Companion-close crashes and iOS missing-microphone failures.
- Make connecting, microphone permission, missing-key and repair states clearer; clear stale voice notices.
- Tie voice requests to a stable turn independently of composer drafts.
iOS and Android
- Adaptive layouts for phones, iPad, foldables and wide windows, with bounded reading columns, improved sidebars, pane-local pickers and fold/tabletop handling.
- Linked-agent panels show live agents, workspace names and waiting status, with accessible dismissal and hardware-keyboard support.
- Background commands appear as compact task rows with a running-task bar and jump targets.
- Attach up to 16 images per message, including multiple selections, named previews and reachable removal controls. Fix attachment transport, restored drafts, truncated photos and sends without repository metadata.
- Preview media and isolated HTML; stream linked assets, original downloads and sharing/saving. Support audio range seeks, cancel discarded transfers, bound retries and explain unavailable previews and older-host limits.
- Improve transcript stability when sending, resizing, expanding tools and loading images; keep Latest and composer actions clear of content and keyboards.
- Structured tool summaries, sideways-scrolling markdown tables/code, rendered text selection, clearer approval cards and failed-message Retry/Remove actions.
- Composer controls show resolved model, effort, speed and access values, with consistent default labels, deduplicated suggestions and usable layouts at larger text sizes.
- Unify running, needs-you, unread and failed states across Home, History, drawers and Companion; update relative times and preserve accurate workspace scope and ordering.
- Improve workspace creation and host folder validation, connection-state reporting, Files loading, Changes/commit navigation, terminal Relaunch, scheduled-task controls, Settings, themes and About/licenses.
- Expand accessibility throughout: larger touch targets, meaningful screen-reader labels, modal focus isolation, Dynamic Type, visible keyboard focus, complete Tab traversal, selectable errors and appropriate pointer cursors.
- Fix iOS drawer swipe dismissal, native search focus, first-character entry and transcript layout loops; fix Android viewport-resize and off-screen keyboard-region crashes.
Web, dependencies and build fixes
- Switch the macOS ARM release runner to supported macOS 15 after GitHub rejected the macOS 14 ARM configuration.
- Stream workspace files with byte-range and HEAD support.
- Update MCP SDK 1.29.0 → 1.32.1, hono 4.13.5 → 4.13.13, zod 4.4.3 → 4.6.7, ip-address 10.5.0 → 10.7.5, body-parser 2.3.0 → 2.4.0, fast-uri 3.1.5 → 3.1.9 and proxy-addr 2.0.7 → 2.0.8.
- Fix iOS CI type-checking, simulator signing/Keychain configuration and native constructor compatibility for orchestration fields.
Validation
Clean temporary root production and web dependency installs passed with frozen, unchanged lockfiles under Bun 1.3.14 and 1.4.4. Platform release artifacts are built and published by the tag-triggered GitHub Actions workflow.
Complete commit history
All 323 commits since v0.1.128
- f34c63d mobile(ios): run liveStatus on the main actor so the Live pill compiles on CI
- 0a4f2ca Settings > Providers: add Update all for outdated provider CLIs
- 07b7cc7 mobile: Live call bar stays on top until ended; audio setup off the UI thread
- ede827c android: fix crash closing the Companion during Live; call bar floats over the app
- d1c85c9 android: sheets sit below the floating call bar so the Companion can be minimized
- f94b9bb android: Live calls keep going in the background, like a phone call
- 193dd28 ios: Live calls keep going in the background, like a phone call
- dad1a6d android: adaptive layout for foldables and wide windows
- 37399c8 ios: adaptive layout for foldables, iPad and wide windows
- 068edfa android: readable icons in side panes; send stays full size in Moss
- dc63953 fx: support per session effort, Fast mode, and steering
- 58332d5 Add Antigravity provider, chat present/reopen, and file-link opening
- d694aa3 Keep the Companion clear of chat controls and workspace panels
- dacd6ba antigravity: show base model names for folded thinking-tier ids
- 4db4ca2 daemon: queue agent prompts sent to a busy thread
- fbb854d desktop: UI consistency pass across chat, panes, sidebars, settings and Companion
- 0eef36d ios: split the Companion bubble view so it type-checks on Xcode 16.2
- f66902f client core: keep a chat readable when model discovery fails
- 373afa7 client core: keep attachment bytes across Android JNI calls
- aaeea68 ios: ad-hoc sign the simulator build so the app can run
- 9330217 ios: decode the core's attachments view so transcript images load
- 2f0dbf8 client core: don't show approval_requested as a transcript row
- 63376bf ios: show a loading state so a Files-tab file opens instead of a blank page
- fa3f5fd ios: keep the first character typed into the composer after focusing it
- 5677fab ios: dock the companion in the top bar of pushed screens (S1)
- bfe4e50 ios: tool rows with kind icons, summaries and labelled sections (S2)
- ee84a1f ios: markdown tables and code scroll sideways with an edge fade (S3)
- ee70fbb ios: one title and full-size Deny / Approve on the approval card
- ffd78fe ios: composer chips show resolved values; one suggestion list (S5)
- faeadcf ios: check a workspace folder on the host before adding it; fix workspace actions, history and new chat rows
- 0bbe38d ios: settings in the shared order with Hosts and About (S8)
- 4d1478b ios: say "1 needs you" in the Companion header and capsule
- 9681201 ios: scrolling or tapping the transcript dismisses the keyboard (I-KB)
- a67a41c ios: start a short patch or full file at the top, not centred
- 110f1dc ios: the brain chip opens Brain, and Back from Brain works
- 59e8447 ios: Live voice errors offer the repair and stay in the Companion (S9)
- a3ba152 ios: filled primary actions in pairing and Hosts (S6)
- a1b1612 ios: list rows and section headers to the shared spec (S7)
- 5f3e5c6 ios: 44-point targets in the drawer and header (S4)
- ef1f658 ios: read images by file name; show the provider's name in the chat header
- 702703f client core: parse tool row bodies into title, summary and sections
- da16eb2 client core: list each slash command once
- ac7c1bc client core: clear "needs you" once an open chat's approval resolves
- a8487f1 client core: name transcript images by their file name
- 6bc9e5a client core: create workspaces through the host's workspace.create
- 85ef10f android: tool rows to the shared spec, and expanding keeps your place (S2)
- 51e8c31 android: tables and code scroll inside rounded frames; neutral inline code (S3, S7)
- a895284 android: composer chips name their value; one suggestion list (S5)
- f9bd493 ios: tool rows use the core's parsed title, summary and sections (S2)
- 6368d52 android: a tool row without a summary shows its body's first real line
- 4fbed1a android: the companion moves into the top bar on content screens (S1)
- 4cbbf68 android: Live voice shows connecting, explains a missing key, and starts after the mic grant (S9)
- 4a993b6 android: tapping or scrolling the transcript puts the keyboard away; Select text (A-KB)
- d42596c ios: rename the header entry type that clashed with a core model
- a0b7a98 android: keyboard focus ring, 48dp targets, uniform terminal keys (S4, S6)
- d3c83c1 android: list rows to the shared spec; drawer tabs never truncate (S7)
- 542103a android: Settings in the shared order, with About and a helper that matches the theme (S8)
- 1d2baf8 android: name the drawer's Changes/Files target; bubble setting says where it shows
- 61504e6 android: collapsing a large tool group keeps its header in place (A2-1)
- e370b97 android: the needs-you badge clears as soon as an open chat's approval resolves (A2-2)
- e5f4f19 android: tables show there are more columns (A2-3)
- 5afa51d android: the terminal key bar's last key clears the screen edge (A2-4)
- eddc927 android: icon buttons and buttons get the keyboard focus ring too (A2-5)
- 96ab013 android: Jump to latest stops covering text; prompts render markdown; Select text is rendered (A2-6, A2-7, A2-11)
- 8f0bf78 android: Open Companion settings lands on the live-voice keys (A2-8)
- 9c20a88 android: relative times on Home, workspaces and history keep up (A2-9)
- 540cc0a android: the composer says "Steer the current reply" once (A2-10)
- fc1a00c client core: re-announce Home when an open chat's approval resolves
- cd85147 ios: Latest strip, markdown prompts, r...
v0.1.128
Highlights
- macOS builds are signed and notarized. Release builds are now signed with a Developer ID (RICHE VENTURES, INC.) and notarized by Apple, so Gatekeeper treats Verde like any other downloaded app. Privacy permissions such as Documents access now carry over to the next update instead of being asked for again after every update. The signature changes from ad-hoc to Developer ID with this release, so macOS asks one last time after you install it (6fbf95e).
- macOS asks for folder access during setup. A new first-run step asks for Documents, Desktop and Downloads access and has a shortcut to Full Disk Access. Existing users see it once too. Until now the first prompt often came from the background daemon while nobody was at the Mac. The macOS prompts also say why Verde is asking (17d0384).
- Browsing folders can no longer freeze the daemon. If a workspace lived in a macOS-protected folder and a privacy prompt went unanswered, browsing folders (for example the iPhone Add workspace browser) could hang the whole daemon. Verde now works out browse roots without opening workspace folders, runs at most 2 folder-browse requests at a time and answers extras with "busy", and the desktop reports "daemon busy" instead of starting a second daemon (b73e485).
- Scheduled tasks. Ask a chat or the Companion to run a prompt later: once, every N minutes, or daily at a set time on chosen weekdays. A task can post into an existing chat or start a new one, and it reports back to the Companion. You can manage tasks from the Companion on desktop, iOS and Android, from
verde schedule, or through MCP tools any agent can use (eccdafa). - Use a workspace on another machine. Run on now finds machines that already have the workspace, or a checkout of the same git repo ("Same origin · Use it"). It can also set the workspace up on another machine from a card in the chat, using a remote folder picker. Pairing is easier too: nearby Tailscale machines connect by approval, a Pairing link fills in the whole form from one paste, and one Settings switch makes this desktop reachable (3ca89b8, 972747d, ede22f7, 9c23f68, 8eb3911, 560ac14, e8ab3d5, 4c39a0f, 82d5ee3).
macOS
- Developer ID signing and notarization: the release jobs sign the app and the DMG with the Developer ID identity, then notarize and staple both. Forks without the signing secrets still get ad-hoc builds (6fbf95e).
- Folder access step: a macOS-only first-run dialog after the provider and MCP steps. It has one row per protected folder (Allow, its status, and Open Settings if access was denied), an "Allow all" button that shows the prompts one at a time, and an "Open Full Disk Access" shortcut. Checks run in the background, so a pending prompt never freezes the window or blocks quitting. Done or Skip is remembered. The app's Info.plist now explains every prompt it can raise: Documents, Desktop, Downloads, network, and removable volumes (17d0384).
Multi-machine and remote runtimes
- Same repository, different machines: each machine's daemon now records every checkout's git
originand shares it with clients. SSH and HTTPS forms of the same remote count as one repository. Workspaces that already existed have their origins filled in in the background when the daemon starts, without delaying startup (3ca89b8, 9c23f68). - Attach a folder as a workspace: a new daemon request attaches a folder on the target machine after checking that it is inside the allowed roots and has the expected origin. If that folder already belongs to a workspace there, the two are linked so chats and files address the same workspace from either side (972747d).
- Run on, with setup: Run on now groups machines into three tiers: machines that already have the workspace, machines with a checkout of the same origin (one click to use it), and "Set up on …" for the rest. If a send fails because the repository isn't bound on that machine, a setup card replaces the error and your draft is kept. The card offers Use it, Pick folder… (browse the remote machine) and Cancel. Devices without write access are told that setup needs a Full device or the owner (ede22f7).
- Setup card fixes: Cancel no longer crashes the app, a failure message no longer covers the card's buttons, and an older machine now says "'s Verde can't set up workspaces yet. Update Verde on " instead of "could not be reached". The remote folder picker won't offer the home folder itself as a workspace (8eb3911).
- Clearer remote send errors: a remote chat that can't start now says "The selected repository is not bound on this runtime" instead of a generic "could not start". Sends that hit a busy connection (for example during a heartbeat or token refresh) retry for up to 15 s instead of failing (560ac14).
- Pair by approval: Add connection lists Verde machines on your tailnet. Connect sends a request that the other desktop shows as " () wants to connect", with a match code and a permission preset. Allow finishes the pairing with no further clicks. Add connection now lists, in order: Nearby machines, Verde Cloud (no machine needed), Pairing link, and SSH under Advanced. Developer status text and raw URLs are gone from the Connect step (e8ab3d5).
- One-paste pairing link: paste the link first and both machine names fill in from the link host and this computer's hostname. A link that already carries the grant starts the exchange right away. Agents can pair machines for you:
verde-daemon pair create --link-hostprints the link, andverde runtime pairplus thepair_runtime/runtime_pair_statusMCP tools run the same visible wizard (4c39a0f). - Remote access switch: Settings → Connections → Remote access makes this desktop reachable over Tailscale Serve, with no commands to run. The card shows "Reachable at https://….ts.net", or the one thing in the way and how to fix it. Turning it off removes only Verde's own gateway and Serve mapping. An existing gateway for the same data is reused instead of starting a second one, and phone pairing uses this address automatically (82d5ee3).
- Verde Cloud accounts: Settings → Connections shows one card per account with its machines inside, instead of one connection per machine. You sign in once per account, a single assigned machine connects on its own after the first sign-in, and the composer's runtime picker shows " · ", including machines not linked yet. Existing connections and the chats pinned to them keep working with no migration (2d601eb).
- Provider sign-in on remote machines: installing and signing in to a provider CLI now runs in a terminal on the remote machine (Verde Cloud, paired, or SSH) without tying up chat. The provider dialog and Settings → Connections show the real sign-in status for Codex, Claude and Cursor, and the setup terminal font shrinks so QR codes and links fit (9422b82).
- Connection logging: the desktop logs each settled connection state once (no secrets), so a reconnect loop leaves a trace. A 5xx from the server while connecting a device now reads as "server unavailable" instead of offline (fd6bde5).
Scheduled tasks
- The daemon runs scheduled tasks: a prompt sent into an existing chat, or into a new chat with a chosen provider and model. A task can run once, every N minutes, or daily at a local time on chosen weekdays. Due tasks fire within 15 s. If the chat is busy the prompt steers or queues, new chats report back to their parent (such as the Companion), and a task missed while the machine was off runs once when it comes back (eccdafa).
- Where to manage them: a Scheduled view in the desktop Companion panel (toggle, run now, delete, details), a Scheduled list with a New/Edit form in the Android and iOS Companion sheet,
verde schedule list|add|enable|disable|remove|run, and MCP tools for any agent. The Companion creates a task itself when you ask for something later or on a schedule. The CLI reference and Companion docs cover it (eccdafa).
Companion (desktop)
- Expand to full size: a header button grows the Companion over the whole workspace area, edge to edge like a maximized pane, with a centered reading column. Conversation text and the composer now use the chat fonts and sizes (af9beba, 6ad7afa).
- Crew: collapsed to a one-line summary by default. It opens itself when a chat needs you, and a manual collapse sticks until the next time something does. Chats that need you and running chats come first, and finished ones fold into an "N done" row with Clear done. When expanded, the crew sits in its own column (c0ec41f).
- Smoother and faster: replies stream in smoothly like chat threads, and a long history now takes about 0.1 ms per frame to draw instead of about 17 ms. The composer border is crisp and matches the chat composer (c0ec41f, 0a2368f).
- Steer while it works: pressing Enter while the Companion is working steers its running turn, as in chats (or queues the message for providers that can't steer). Before, the message was refused and stayed in the draft. Steers show as your own bubble labeled "You · steering" (ccfc9b4, 502202f).
- Close conversations: the menu has "Close this conversation", and each remembered conversation has an ×. Closed conversations are archived, not deleted, and don't show up as ordinary sidebar chats. A conversation that hasn't started yet can be dismissed too (be4a187, 0bf8dde).
- Stays out of the way: opening a chat, terminal or new thread from the sidebar minimizes the Companion instead of opening behind it. Companion conversations started from a phone no longer open as desktop chat panes or appear under Open in the sidebar (1fd41d3, 1a2b083).
- Messages from other devices: Live voice transcripts and other lines saved by your phone now appear in the Companion panel (03f7bd0).
Live voice
- **Live voice o...
v0.1.127
Highlights
- The Linux browser pane works with WPE WebKit 2.54 again. Arch's
wpewebkit2.54 dropped WebKit's legacy libwpe API. The v0.1.126 browser helper linked that API and failed to start on updated Arch/Omarchy systems, so the browser pane went blank. Release builds now ship only the WPE Platform backend, which was already the default at runtime (58cc910, ed0b412). - A friendlier desktop Companion. It collapses to a compact, draggable bubble and the panel animates open and closed. Its conversation text can be selected and copied, and its brain menu has a reasoning-level picker. The + button now starts a new conversation (3961d5f, a64f216, 8bdb1ac, f5d9027, 61c093e).
- Mobile Companion polish. On iOS and Android the activity strip is tappable, companion chats stay out of thread lists, and saved Live voice transcripts show who said what (6bb78f3, f1f552c, 1ca0945, cb2a373).
Linux packaging
- Release builds pass
-Dbrowser-linux-fdo=false. The opt-in legacy fdo backend (VERDE_BROWSER_LINUX_BACKEND=fdo) is no longer included in release builds (ed0b412). - Local builds drop the fdo backend automatically when WPE WebKit was built without its legacy API, so
mise run dev-buildworks on Arch again (58cc910). - AUR
verde-bin: the package now depends onwpewebkit>=2.52, the oldest version with every WebKit API the helper uses, and no longer depends onlibwpeorwpebackend-fdo(ed0b412).
Companion (desktop)
- Bubble: the collapsed Companion is a 44pt round bubble you can drag anywhere. Text appears only when something needs you, with a needs-you count badge and a dot while work runs (3961d5f).
- Panel: it slides in and out, and Settings → Reduce motion has a Companion switch that makes it snap (a64f216). The header has hover tooltips and visible dropdown chevrons, and the prompt is focused when the panel opens (61c093e, eccea02, dd2001d).
- Conversation:
- Brain menu: a Reasoning row with the same per-provider levels as the chat composer (f5d9027).
- Crew:
verde live chat open --parent-thread-idlinks CLI-opened chats to the Companion's crew (12dc711). - Cursors: pointer cursors over prompt-box controls in chats and the Companion (fef0220, ce2e0aa).
Companion (iOS and Android)
- The activity strip is tappable and merges linked crew with every running chat on the machine. Companion threads stay out of the sidebar, Home and workspace lists (6bb78f3, f1f552c).
- Saved Live voice transcripts group by speaker: "You · voice" bubbles and "<Name> · voice" replies (1ca0945, cb2a373).
Providers
- Muse: draining sessions are preempted, and resume is retried on
sessionInUse(c25a22c).
Tests and docs
- Leaner test suite: about 2,430 Zig tests down to about 900, and about 1,130 web/mobile/script tests down to about 450. Flaky timing, process-spawning and snapshot tests are gone (145c4f0).
- Docs: README overhaul with desktop and mobile previews and promo videos, links to every third-party component's license, and a website tour video and screenshot gallery (859a920, c8bcaa4, 8ef0f4a, 30692ca, 959f420).
v0.1.126
Highlights
- Image previews on iOS and Android. Images in chat transcripts now show as thumbnails. They're cached on disk and open in a full-screen viewer. The daemon keeps the images you send and serves each one only through the message that carries it (364e5b9, 2078cfc, 55749a3, 0ce7356).
- Steer or interrupt while a turn runs, on every provider. On iOS and Android, a message sent mid-turn now steers by default. Providers with native steering (Codex, Claude, Pi) get it inline. Every other provider gets an interrupt follow-up: Verde stops the running turn and sends your message as the next turn in the same session. Queueing to run after the reply is still available with a long-press on Send (e48e314, 8d5c74c, 7df0c10).
- A machine-wide Companion. There is now one Companion roster per machine, owned by the daemon, with names, characters, brains and standing orders. Companions can delegate to chats in any workspace. It's available on desktop, web, iOS and Android, with hold-to-talk and Live real-time voice on mobile (7af3aef, 172bde2, b1ba908, 81065d4).
- Friendlier first run on desktop. A welcome screen replaces "No workspaces yet", and an in-app directory browser replaces the external zenity/kdialog dialog. You can also sign in to providers inside the Connect an AI provider dialog (c6932b7, b05b2d5, 04b5571).
- Custom ACP agents. Any stdio ACP agent can be added in Settings > Providers. ACP providers also get live slash-command lists, per-turn usage rows and resume fixes (61e0aeb, cdd4d99, e4a87d7).
Mobile image previews
- Daemon: claimed staged images are copied into an owner-only attachment store with 90-day retention.
chat.attachment.readserves an image only through the message row that carries it, in bounded base64 chunks. It's allowlisted for paired devices withchat:read(364e5b9). - client_core: new
attachment_fetch/attachment_releaseevents, and transcript rows carry message ids so clients can request previews (2078cfc). - Android and iOS: transcript image thumbnails with a disk cache and a full-screen viewer (55749a3, 0ce7356, 14d2bff).
Steer and interrupt follow-ups
- client_core:
followup_submitacceptskind: interrupt.- It immediately sends
chat.turn.cancelwithfollowup_pending: true, so the stop isn't recorded as a user stop. - As soon as the turn ends, whatever its status, the follow-up is sent like a queued message, with the same attachments and voice flag.
- If the cancel fails, the follow-up falls back to queue. Images can't ride a native steer, but they can interrupt (e48e314).
- It immediately sends
- iOS and Android: steer by default while a turn runs. That means native steering where the provider supports it (text only), and interrupt-and-continue everywhere else. Long-press Send offers the other options (7df0c10, 8d5c74c, dba2bcc).
Companion
- Composer: a roomier companion composer on iOS and Android (7df0c10, 8d5c74c). The compact Companion sheet has a one-row header, collapsible needs-you/crew summary pills, a denser conversation and a single-row composer with the mic inline (71f47ed, 7d94908).
- Roster and orchestration:
- Desktop: avatar dock, needs-you inbox, crew, conversation, companion/brain menus, rename and standing-orders modes, and a welcome-back recap (7af3aef).
- Web: Companion dock, panel, crew and settings (172bde2).
- iOS and Android:
- The Companion lives in a draggable floating bubble that snaps to a screen edge. It shows a needs-you badge and a running ring, and pops a short speech chip for new items or replies. Home is the classic dashboard again. Long-press the bubble to hide it, and turn it back on in Settings (81065d4, 1fead59, e720067).
- Companion home and settings screens with character art (acc642f, 2ff2f91, a69d1f1).
- Voice:
- Hold-to-talk uses on-device speech recognition, and the Companion speaks its replies (263d08c, 3289e9a, cf45856).
- Live real-time voice works with xAI, OpenAI or Gemini. The desktop daemon mints short-lived session tokens (
voice.providers,voice.provider.configure,voice.session.create), so API keys stay on the desktop and are never persisted or logged on the phone (b559408, 32955ea, c4fb3fc). - Live voice conversations are saved into the companion chat as text, one line per spoken utterance, including xAI user transcripts (a5e3962, 4fb6fde, f419766, 1e32dbb, 59439ac).
- Brains:
companion.brain.switchmoves a companion's conversation to another provider in place. The outgoing brain writes a visible successor brief, which is replayed with recent history to the new brain on its first turn.- The roster remembers up to 12 past conversations, with New conversation and resume on desktop, iOS and Android (54079cc, 35a088a, 43869d1, d32b3fa, 6efcad3).
- Docs: machine-wide Companion (ef87880).
Daemon and session fixes
- Terminals opened from another client, such as a phone, now appear in every client's sidebar right away. The daemon journals session create, exit and remove, which it never did before (bd0eec9).
- Reattaching or reconnecting to a terminal no longer types stale replies into the foreground program. Replaying history used to re-answer old terminal queries, such as Muse's OSC 4 palette probe. Replies are now sent only for live output (0f3443a).
- Installed providers no longer show "Could not verify" on first launch when no workspace is open. Provider probes inherit the daemon's working directory (46869d4).
- Codex and OpenCode report sign-in status without a running server. When the live check is unknown, the daemon falls back to
codex login statusand OpenCode'sauth.json(2699dbc). - A workspace folder that only holds sibling checkouts now gets turn snapshots, the branch/push chip, the review sheet and Changes for the repositories directly beneath it (up to 8) (2d72126).
- The daemon store is now the only writer of
state.sqlite. The desktop's legacy full-state writer is gone, and its database client is read-only (607de83).
Providers
- Custom ACP agents: Settings > Providers adds a "Custom ACP agents" card. Agents saved under
chat.custom_acp_agentsappear under "Custom ACP" in the model picker without a daemon restart (61e0aeb). - Shared ACP fixes for Grok, Cursor, FX and custom agents (61e0aeb):
- Threads resume with
session/resumewhen the agent supports it. - Verde's HTTP MCP server is passed only to agents that advertise HTTP MCP support.
- Unknown agent requests get
-32601instead of hanging. - ACP plans show on the Todos plan card.
- FX keeps the user's
~/.fx/mcp.jsonservers.
- Threads resume with
- Slash commands and usage:
- Model and reasoning fixes:
- Muse: Wonder 1.0 is the new default. Wonder Full 1.0 is in the model lists on desktop, web and mobile (75e123e, 5d950a5, af5651f).
Platform fixes
- Desktop:
- First-run welcome screen with an Add workspace folder action, up to five suggested folders, a provider status grid and keyboard navigation. Also fixes the "New chat" button's contrast on the empty-pane screen (c6932b7).
- In-app directory browser for every folder picker. It has breadcrumbs, a filter-or-path field, Places, git badges, a hidden-files toggle and an inline "Create directory" row. Add Workspace opens it directly (b05b2d5).
- Provider Sign in / Install runs in an inline setup terminal, even before any workspace exists. The model picker dims providers that aren't connected (04b5571).
- iOS and Android: a top-bar host switcher lists every saved host and has an "Add new host" entry (5e62f39, 3c63e86).
- Linux:
mise run setupinstalls WPE WebKit development packages through pacman, apt or dnf, along with the provider bridge'snode_modules. The Rust toolchain is pinned in mise (0add8a0).
SDK and dependency changes
- None.
package.json,package-lock.json,bun.lockandpackages/web_app/bun.lockare unchanged since v0.1.125. Frozen installs were verified from clean copies with Bun 1.4.3 and 1.3.14, and no lockfile changed.
Chores
- Removed the stale verde-cloud folder path from
verde.toml(92e1812). - Android CI: transcript test waits allow for cold Robolectric starts (f0920ac).
Full Changelog: v0.1.125...v0.1.126
v0.1.125
Highlights
- No more SDL: the desktop app runs on Palette end to end. Windowing, input, clipboard, cursors, fonts, PNG decoding and GPU rendering now go through Palette's own platform layer. It talks to Wayland, Win32 and AppKit directly and renders with Vulkan, D3D11 or Metal. SDL3, SDL3_ttf, zsdl and wayland-client are gone from the build, the release packages, CI and the AUR dependencies (8d91689, c468e92, 9afade3, 86d48cc, 6d154fb, 2081109).
- Changes and Files side panel on every client. You can review every uncommitted file across a workspace's repositories and filter by the chat that changed it. You can browse and search the workspace tree, open files in a viewer, and select diff or file lines to ask the agent about them. It's on desktop, web, iOS and Android, backed by new daemon RPCs (08e6418, 8e3ad70, f31f47c, c0eee20, 5e23841, 861bbc9, 8af5338).
- Per-tab browsers in a right side panel. A browser now belongs to a workspace tab and docks into a resizable right side panel instead of being tiled into the layout. "Move to own tab" and "Attach to tab" switch between the two (e1ed658).
- Zero-copy browser frames on Linux. WPE pages reach the GPU as dma-buf textures with fences and damage rects, and frames where only the browser changed repaint just the browser rect (f1de4e6, 2561e8b, 95fe172).
- Windows fixes. Verde no longer crashes on launch or fails to start its daemon when the registry PATH contains a stray NUL. WebView2 and the first window are placed correctly at 125–150% scaling, the window frame shows the app icon, and provider Install / Sign in open a PowerShell terminal (6430f31, 173e685, 1478910, ba8af08, fe1b678).
- Mobile push notifications with Approve, Deny, Reply and Stop actions on iOS (APNs) and Android (FCM). Payloads are end-to-end encrypted and decrypted on the phone (0300813, 9d3dc6a).
Palette port (desktop UI toolkit)
packages/palettenow vendors Palette's pure-Zig platform layer, renderer, fonts and PNG codec in place of the SDL renderer. The package keeps its name, so existing imports are unchanged.VENDORED_FROMrecords the source commit, andscripts/dev/vendor-palette-native.shre-syncs it (8d91689, 2d85de5, 0a20810).- The main loop runs on
palette.platform.App. It covers window creation, event waiting bounded by the renderer, cross-thread wakeup, close and visibility handling, theme and display bounds. SIGINT and SIGTERM use Verde's own handlers, so forked shells and the daemon no longer inherit a blocked signal mask.VERDE_APP_IDoverrides the app id for isolated runs (9afade3). - Input, clipboard, cursors and the data-directory path go through Palette. The data directory stays the same as in SDL-era installs, so existing state is found (86d48cc). macOS clipboard images are read through
App.getClipboardImage(04467b9). - Rendering uses
palette.Graphics. Text is measured with the same fonts it's drawn with, and images and browser frames are uploaded or streamed as textures (6d154fb). Metal ships a precompiled shader library and compiles at runtime only as a fallback (2d85de5). - Linux browser pages are shown as offscreen textures. The Wayland subsurface probe and the SDL host handles are gone. On macOS and Windows the page attaches to Palette's NSWindow or HWND (df83971).
- Libc-linked executables link with LLD (c468e92).
- The icon font falls back to Codicon. Newer icons, such as the
.txt/.log/.csvfile icon, now draw instead of an empty box (1606508, 607437a). - Fixed typed text that vanished or measured zero width after some keystrokes. Glyph runs were cached empty when the shape cache rotated (994372c).
- Pasting into the composer keeps newlines (73d1fff).
- Windows: the window frame and Alt+Tab show the exe's icon (ba8af08).
- macOS: test app ids use a private pasteboard, so live checks don't overwrite the user's clipboard (87e4267).
Workspace Changes & Files
- Daemon:
workspace.files.listandworkspace.files.readadd a lazy tree and file preview, confined to each root viaopenat2 RESOLVE_BENEATH..gitis hidden, gitignored entries are flagged, binary files are detected, and text and images are capped (08e6418).git.changes.workspaceandgit.changes.file_patchcover every repository in a workspace. They report working tree vsHEAD, with untracked files counted as added, per-file numstat and owner chats. Both are read-only, run without the daemon lock, and are routed to paired devices and remote runtimes (8e3ad70).
- client_core: a shared workspace explorer and a single ask-agent prompt format (path,
line A/lines A–B, diff side and a fenced selection) used by all clients (14a54f9, e91d889). - Desktop Changes view:
- The header shows repository, branch, file count,
+/-totals, a Commit button, refresh, expand all and a stacked/split toggle. - Filter chips: All, one per chat, and Unassigned.
- Files are grouped by repository, with lazily loaded diffs and stepwise context expansion (fd8bff0, f31f47c).
- It refreshes on open, on chat activity (debounced), after commits and on demand, with no polling.
- The header shows repository, branch, file count,
- Desktop Files view:
- File viewer: files open as tabs in the side panel, with a pop-out into their own workspace tab. Ctrl+W closes a docked file (d97c398, 969f305).
- Ask agent: a popover for file viewer and Changes diff selections. It sends straight to an idle chat, queues as a follow-up for a busy one, and never overwrites a draft (25dd581, bdd6e97, 4de47de).
- Web: Changes and Files side panel, docked beside the canvas on wide screens and as a sheet on narrow ones (5e23841).
- iOS and Android:
- Workspace Changes with the by-chat filter, a diff screen with full-file and wrap toggles, and Files with a lazy tree and ask-agent line selection. Commit uses the existing chat commit sheet (861bbc9, 8af5338).
- Files cut at the read cap show a "Showing the first 512 KB of N MB" banner with a full-file Download (f9ab9cd).
Side panel & layout
- Right side panel with Browser and Agents views. Open state and view are per tab, the width is shared and resizable, and the toggle sits at the end of the tab strip, or between zoom and the pane menu when the strip is hidden (e1ed658, 1cf6e2c, 8c60a1b).
- Toggle the right side panel with Ctrl+Alt+S, or prefix then Shift+B, on desktop and web. Ctrl+S still toggles the left sidebar (408ed4f, 0e04663).
- Every browser MCP tool accepts
thread_id, so an agent's navigate, eval, click, screenshot and status calls drive that agent's own tab browser rather than the user's (5b20a3a). - Workspace scrolling is now opt-in. The default keeps herdr-style tabspaces: each tab fills the view, switching jumps in place, and there's no wheel scrolling or peeking at neighbours. Set scrolling to Auto or Always for the niri-style strip. The web client follows the same rules (2b35a31).
- The sidebar's OPEN caption stays pinned while rows scroll beneath it (54d8600).
Sidebar & workspaces
- Closed workspaces collapse under a "Closed Workspaces" group (with a count) in the switcher on desktop, web, iOS and Android. A search still finds them (1aa2f09).
- Picking an open workspace in the composer's directory picker moves the chat into that workspace and follows it there, instead of only borrowing its folder (4f895fe).
- Moved chats keep their pane in the target workspace instead of disappearing from the sidebar (b8fe896).
- Web: under All Workspaces, Ctrl+1..0 and Ctrl+Tab / Ctrl+Shift+Tab follow the sidebar rows, matching desktop (c408715).
- Web: ACTIVE shows terminals that were already working when the page loaded (8217f37).
Chats & agents
- Linked-chat results show as compact one-line rows that expand on click. Rows that need you (approval, blocked, failed) open expanded, and titles never fall back to a raw thread id (7fd48fd).
- A late Claude or Codex steer is queued as a follow-up instead of failing with "turn cannot accept steering now" (527e3c2).
- Claude agents that Claude Code puts in the background without
run_in_backgroundare now tracked until they finish, so steering keeps working (dea5f55). - Background agents that outlive their turn, or are resumed after a restart, stay live in their cards and panes (3899592).
- One card per live background task stays pinned mid-turn, with no duplicate "Details" / "Output" cards (aaba94d).
- Stopping a background task whose process is already gone collapses the row instead of leaving a Stop button that can't work (8c2a8d4).
- Reply text stays whole while a parallel Codex subagent streams. Previously it was split into one row per child chunk (7b21e4d).
- Selected transcript text renders exactly like unselected text: no glyph jumps, and inline-code pills and blockquote chrome are kept (80e3c5e).
- Web: images over the 10 MB cap are downscaled in the browser instead of rejected, and non-image files may be up to 100 MB (c1b4345).
- Web: workspace and connection pickers under the prompt (0673d44).
- Spaced file paths in
<...>links open (5461852).
Browser
- Address bar:
- The history and search dropdown appears above the page on Windows and macOS; the native page hides while it's open (4619dbd, ab5bdda).
- The dropdown stays inside narrow panes instead of running off the window (064b4c6).
- Enter loads the highlighted suggestion. Previously, typing "m" with a history row highlighted went to
https://m/(ba23985). - Clicking a suggestion loads that row. Previously it did nothing (767cf88).
- The toolbar's
...menu hides the native page while open, and a second click o...
v0.1.124
Highlights
- Sidebar workspace switcher on every client — the per-workspace folder tree is replaced by a single-scope rail with a searchable workspace switcher (default All Workspaces) on desktop, web, Android and iOS. Workspaces get a stable identity icon + color (hashed from the workspace id), which you can now override per workspace.
- Git change review and commits from a chat — per-chat git change review with a commit sheet on desktop and web, plus chat-header git controls.
- Managed workspace creation — the Add Workspace dialog can create or import folders through daemon-authorized folder browsing.
- Local servers on the new-tab page — a blank browser tab lists live localhost dev servers; click one to open it.
- Crisp chrome at fractional scales — whole-pixel strokes on edge-snapped geometry across the app, browser chrome and context menus.
Sidebar & workspaces
- Workspace switcher popover lists open and closed workspaces by recency with per-row settings; new chat / new terminal sit beside the search pill, and a
+new-workspace button sits right of the switcher (7a3b534, c88182e). - Editable workspace icon (16) and color (8) with an Automatic reset — desktop settings band, web "Edit icon..." dialog, iOS sheet and Android dialog, and
verde workspace identity --icon/--color <n|auto>. Stored in the daemon (SQLite schema v17) (fe9a406). - ACTIVE now spans all open workspaces on every client; only OPEN follows the switcher scope (fe9a406).
- Under All Workspaces, OPEN orders panes newest-activity first on desktop, web, and the mobile drawers; split tiles move as one unit (76f6fe7, 9ef96a9, a68ced2).
- Workspace identity chips on OPEN tile groups, tighter 30px tile rows, and chips in the composer directory picker and pill (6d01733, 0e7ba02).
- Sidebar scope (All Workspaces vs. one workspace) is remembered across relaunch (29289fd).
- Under All Workspaces, keyboard navigation follows the sidebar rows: Ctrl+1..0, Ctrl+hjkl stepping off a tab, and Ctrl+Tab / Ctrl+Shift+Tab (e7e994e).
- Web: workspace reordering and reopening (3c57637).
- Desktop: the icon-only collapsed rail and workspace drag-to-reorder are removed — the toggle now shows or hides the full rail. While hidden, a show-sidebar button leads the workspace tab strip, and strip tabs carry pulsing status pips (be37b0a, cbb2113). Alt+0 / prefix Shift+A show all workspaces; Alt+N scopes to workspace N.
Chats & git
- Per-chat git change review and commit controls on desktop and web (1bbcff1, 5471784, b780223).
- Chat header git controls and steadier transcript refresh (836a9b5).
- Restore a chat's pane when another client (phone, History unarchive) reopens it, without moving focus (687facc).
- Web: layout panes bind to the daemon's visible thread ordinals, fixing panes that showed the wrong chat, a duplicated chat, or a missing open chat after closes/moves (18aaa71).
- Orchestration: parents are notified once per child run instead of once per queued message (66f0393).
Mobile
- Never-sent drafts are hidden from Recent chats, workspace chat lists and counts (9f6e900).
- Git summaries are scoped and debounced; Android chat responses are prioritized (f081ed1).
- Android reclaims chat focus on quick return and traces RPC timing (4fb624d).
Browser
- Local servers card on the empty new-tab page (Linux): scans loopback listeners while visible and skips APIs, databases and Verde's own daemon (b9fb923).
- Fix a GUI segfault when typing an address that matched history — suggestion rows now own their history strings (8a3c150).
- Crisp tab pills, address field, inspector buttons and menus at fractional scales (1d1174c).
Connect & runtime
- Connect link recovery: a verified link receipt is persisted before endpoint enrollment, so a failed enrollment or restart leaves the remote link unlinkable. Rollback is limited to links this request created, and Connect mutations are serialized in the daemon. This is the fix shipped standalone in v0.1.123, now on master (ad4084f).
- Opt-in native runtime composition via
VERDE_RUNTIME_INTEGRATION_*build env; default builds are unchanged (ad4084f). - Scrolling strip: zoom stays inside the closed/created pane's tab (ad4084f).
- Native webview install check honors
TMPDIR(ad4084f).
Visual polish
- Crisp stroked rects app-wide: whole-pixel strokes on edge-snapped geometry; context menus draw a single panel (75fc3ed, 1d1174c).
- Borderless switcher trigger with no resting fill; identity glyphs centered by ink (6597917, 70c98e8).
- Ellipsis icon for the pane options button (636fc43).
Build
- Commit pending workspace / git-change / title work so a clean master checkout builds (b780223).
Full Changelog: v0.1.122...v0.1.124 (v0.1.123 was tagged off-branch; its change is included via ad4084f.)
v0.1.123
Full Changelog: v0.1.122...v0.1.123
v0.1.122
Full Changelog: v0.1.121...v0.1.122
v0.1.121
Connect runtime proofs now sample the signing clock after the challenge exchange, so discovery/network latency cannot make a newly generated proof fail the service freshness check. Endpoint proofs and connector expiry checks also use current time. Signature and challenge-expiry enforcement remain unchanged.
This release also includes the committed correction that preserves sender labels for agent prompts hydrated into the desktop UI. It retains v0.1.120's bounded native-TLS DELETE transport fix for Connect unlink/logout. No SDK/dependency version changes were made for v0.1.121; root/web frozen installs passed with the workflow Bun versions and unchanged tracked lockfiles.
Validation: clean ReleaseSafe native build and isolated install payload check; owning runtime tests including actual Ed25519 delayed-challenge and expired-challenge regression; real native TLS isolated unlink/logout; full daemon integration with the built CLI. Restoring the prior clock sampling made only the new timing regression fail.
v0.1.120
Connect unlink and logout now send the required DELETE JSON body through Zig's native HTTP/TLS transport without triggering the Zig 0.16 body-writer assertion. The transport keeps certificate/hostname verification, exact Content-Length, bounded responses and deadlines, and refuses redirects and truncated responses. POST behavior is unchanged.
This release also includes the committed daemon orchestration fixes since v0.1.119: restarting no longer replays idle-parent notifications, clearing a child link stops delivery, agent messages carry sender labels, and child-event notifications do not cascade into new tasks. It includes the clean-source GUI/daemon build corrections and the existing Claude SDK 0.3.284 / Sonnet 5.5 update, with the Bun lock synchronized to the committed manifest/npm lock.
Validation: native loopback TLS transport tests, isolated daemon unlink/logout credential cleanup, complete headless daemon IT, owning runtime tests, clean packaging/install verification, and clean frozen root/web installs with official Bun 1.3.14 and 1.4.2. The IT harness's decoded DTO allocations now have scenario arenas and allocation traces; the final parent harness run emits no allocator leak reports. These offline tests do not claim live Cloud login or hosted workspace acceptance.
Release repairs: include the missing native desktop relay/viewer/type modules
already referenced by committed web code, and make directory confinement error
handling portable across Linux/macOS/Windows. The web gateway still binds
loopback; host desktop access remains explicitly configured and owner-authenticated.
Clean web tests/types/build and cross-platform directory compilation pass.